diff options
author | Frans Meulenbroeks <fransmeulenbroeks@gmail.com> | 2010-08-15 09:36:32 +0200 |
---|---|---|
committer | Frans Meulenbroeks <fransmeulenbroeks@gmail.com> | 2010-08-15 09:36:32 +0200 |
commit | 46316e8ef5c4421ffe55f40f163816be258fb79f (patch) | |
tree | 5e5e9b101f665eb95fd7dcfa235e6b6187c678e0 /recipes | |
parent | c2e3f410ad356fdec7ecd10754ecc5a7c63b46b7 (diff) |
vim: removed old patch
missed the removal of this by giving a wrong git command
this corrects things
Signed-off-by: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
Diffstat (limited to 'recipes')
-rw-r--r-- | recipes/vim/vim-7.2/001-411.diff | 51287 |
1 files changed, 0 insertions, 51287 deletions
diff --git a/recipes/vim/vim-7.2/001-411.diff b/recipes/vim/vim-7.2/001-411.diff deleted file mode 100644 index 420ac937d3..0000000000 --- a/recipes/vim/vim-7.2/001-411.diff +++ /dev/null @@ -1,51287 +0,0 @@ -Patches for Vim - Vi IMproved 7.2 - -Individual patches for Vim 7.2: - - SIZE NAME FIXES - 1877 7.2.001 Mac: pseudo-ttys don't work properly on Leopard - 1462 7.2.002 leaking memory when displaying menus - 3663 7.2.003 typo in translated message, message not translated - 3413 7.2.004 Cscope help message is not translated - 4638 7.2.005 a few problems when profiling - 1552 7.2.006 HTML files are not recognized by contents - 16735 7.2.007 (extra) minor issues for VMS - 1947 7.2.008 wrong window count when using :bunload in a BufHidden autocmd - 2245 7.2.009 can't compile with Perl 5.10 on MS-aindows - 5415 7.2.010 "K" in Visual mode does not properly escape all characters - 2873 7.2.011 error when inserting a float value from expression register - 1444 7.2.012 compiler warnings when building with startup timing - 4157 7.2.013 hang when waiting for X selection, consuming lots of CPU time - 1769 7.2.014 synstack() doesn't work in an emptly line - 1943 7.2.015 "make all test install" doesn't stop when the test fails - 4536 7.2.016 cmdline completion pattern can be in freed memory - 5319 7.2.017 X11: strlen() used wrongly, pasting very big selection fails - 1390 7.2.018 memory leak when substitute is aborted - 2269 7.2.019 completion and exists() don't work for ":noautocmd" - 1521 7.2.020 "kvim" starts the GUI even though KDE is no longer supported - 4806 7.2.021 getting full file name when executing autocmds may be slow - 3823 7.2.022 (extra) cannot run tests with the MingW compiler - 2062 7.2.023 'cursorcolumn' wrong in a closed fold when display is shifted - 1452 7.2.024 'history' can be made negative, causes out-of-memory error - 1470 7.2.025 a CursorHold event that invokes system() is retriggered - 2969 7.2.026 (after 7.2.010) 'K' uses the rest of the line - 3235 7.2.027 can use cscope commands in the sandbox, might not be safe - 1466 7.2.028 confusing error message for missing () - 1291 7.2.029 no completion for ":doautoall" like for ":doautocmd" - 1546 7.2.030 (after 7.2.027) can't compile, ex_oldfiles undefined - 39400 7.2.031 file names from viminfo are not available to the user - 1583 7.2.032 (after 7.2.031) can't compile with EXITFREE defined - 2270 7.2.033 using "ucs-2le" for two-byte BOM, but text might be "utf-16le" - 2372 7.2.034 memory leak in spell info when deleting a buffer - 3522 7.2.035 mismatches for library and Vim alloc/free functions - 7545 7.2.036 (extra) mismatches for library and Vim alloc/free functions - 1576 7.2.037 double free with GTK 1 and compiled with EXITFREE - 2438 7.2.038 overlapping arguments to memcpy() - 1378 7.2.039 accessing freed memory on exit when EXITFREE is defined - 1836 7.2.040 ":e ++ff=dos foo" gets "unix" 'ff' when CR before NL missing - 22993 7.2.041 (extra) diff wrong when edit diff buffer in another tab page - 4987 7.2.042 restoring view in autocmd sometimes doesn't work completely - 2550 7.2.043 VMS: Too many chars escaped in filename and shell commands - 5639 7.2.044 crash because of gcc 4 being over protective for strcpy() - 2056 7.2.045 the Python interface has an empty entry in sys.path - 1704 7.2.046 wrong check for filling buffer with encoding - 2470 7.2.047 using -nb while it is not supported makes other side hang - 4758 7.2.048 v:count and v:prevcount are not set correctly - 32552 7.2.049 (extra) Win32: the clipboard doesn't support UTF-16 - 8484 7.2.050 compiler warnings for not using return value of fwrite() - 15179 7.2.051 can't avoid 'wig' and 'suffixes' for glob() and globpath() - 2611 7.2.052 synIDattr() doesn't support "sp" for special color - 1754 7.2.053 crash when using WorkShop command ":ws foo" - 2006 7.2.054 compilation warnings for fprintf format - 34319 7.2.055 various compiler warnings with strict checking - 1635 7.2.056 (after 7.2.050) tests 58 and 59 fail - 3210 7.2.057 (after 7.2.056) trying to put size_t in int variable - 2338 7.2.058 can't add a feature name in the :version output - 1847 7.2.059 diff is not always displayed properly - 34772 7.2.060 spell checking doesn't work well for compound words - 1886 7.2.061 creating funcref requires loading the autoload script first - 1657 7.2.062 "[Scratch]" is not translated - 3558 7.2.063 warning for NULL argument of Perl_sys_init3() - 1942 7.2.064 repeating "~" on a Visual block doesn't always update screen - 5149 7.2.065 GTK GUI: cursor disappears doing ":vsp" when maximized - 2759 7.2.066 not easy to check if 'encoding' is a multi-byte encoding - 1683 7.2.067 can't load sesison extra file when it contains special chars - 2598 7.2.068 error when Emacs tags file line is too long - 1726 7.2.069 (after 7.2.060) compiler warning for putting size_t in int - 17606 7.2.070 crash when a function returns a:000 - 2353 7.2.071 (extra) Win32: Handling netbeans events may cause a crash - 1615 7.2.072 (extra, fixed patch) compiler warning in Sniff code - 4121 7.2.073 ":set <xHome>" has the same output as ":set <Home>" - 1832 7.2.074 (extra, after 7.2.073) extra part of 7.2.073 - 2218 7.2.075 (after 7.2.058) unclear comment about making a diff - 2666 7.2.076 rename(from, to) deletes file if names refer to the same file - 4745 7.2.077 (after 7.2.076) rename() fails if names differ only in case - 3298 7.2.078 problems with deleting folds - 6947 7.2.079 "killed" netbeans events are not handled correctly - 9942 7.2.080 accessing wrong memory with completion and composing char - 1728 7.2.081 compiler warning for float overflow on VAX - 2134 7.2.082 if 'ff' is "mac" then "ga" on a ^J shows 0x0d instead of 0x0a - 1733 7.2.083 ":tag" doesn't return to the right tag entry in the tag stack - 4331 7.2.084 Python: vim.eval() is wrong for recursive structures - 1862 7.2.085 ":set <M-b>=<Esc>b" does not work when 'encoding' is utf-8 - 3045 7.2.086 using ":diffget 1" in buffer 1 corrupts the text - 1570 7.2.087 adding URL to 'path' doesn't work to edit a file - 2895 7.2.088 (extra) Win32: Using the clipboard sometimes fails - 2473 7.2.089 (extra) Win32: crash when using Ultramon buttons - 3286 7.2.090 user command containing 0x80 does not work properly - 2113 7.2.091 ":cs help" output is not aligned for some languages - 4538 7.2.092 some error messages are not translated - 7287 7.2.093 (extra) dialogs can't always handle multi-byte text - 3430 7.2.094 compiler warning for signed/unsigned compare, typos - 1902 7.2.095 using "r" and then CTRL-C Visual highlighting is not removed - 1464 7.2.096 after ":number" "Press Enter" msg may be on the wrong screen - 1692 7.2.097 "!xterm&" doesn't work when 'shell' is "bash" - 1864 7.2.098 warning for signed/unsigned pointer - 3498 7.2.099 unnecessary redraw when changing GUI options in terminal - 3846 7.2.100 missing first three bytes on sourced FIFO - 1362 7.2.101 (extra) MSVC version not recognized - 1496 7.2.102 (after 7.2.100) BOM at start of Vim script not removed - 5153 7.2.103 tab page line isn't always updated, e.g. when 'bomb' is set - 1523 7.2.104 after ":saveas foo" the tab label isn't updated right away - 2159 7.2.105 modeline setting for 'foldmethod' overrules diff options - 3422 7.2.106 endless loop for "]s" in HTML when there are no misspellings - 1825 7.2.107 After a GUI dialog ":echo" messages are deleted - 1622 7.2.108 (after 7.2.105) can't compile without the diff feature - 11901 7.2.109 'langmap' does not work for multi-byte characters - 1407 7.2.110 compiler warning for unused variable - 2724 7.2.111 selection unclear for Visual block mode with 'cursorcolumn' - 1509 7.2.112 cursor invisible in first col in Visual mode if 'number' set - 2700 7.2.113 crash when using submatch() in substitute() - 2531 7.2.114 using wrong printf format: %d instead of %ld - 2716 7.2.115 some debugging code is never used - 1619 7.2.116 not all memory is freed when EXITFREE is defined - 2592 7.2.117 location list incorrectly labelled "Quickfix List" - 2068 7.2.118 <PageUp> at the more prompt only does half a page - 1550 7.2.119 status line is redrawn too often - 8305 7.2.120 location list is copied and then deleted when opening window - 4993 7.2.121 can't stop output of "!grep a *.c" in gvim with CTRL-C - 2472 7.2.122 invalid mem access if VimResized autocmd changes screen size - 1568 7.2.123 ":map" output continues after typing 'q' at more prompt - 3127 7.2.124 ":tselect" output continues after typing 'q' at more prompt - 3936 7.2.125 leaking memory when reading XPM bitmap for a sign - 4326 7.2.126 when EXITFREE is defined signs and keymaps are not freed - 1708 7.2.127 get another more prompt after typing 'q' - 1537 7.2.128 (after 7.2.055) ":lcd" causes invalid session file - 2229 7.2.129 opening command window from input() uses the search history - 12852 7.2.130 Vim may haing until CTRL-C is typed when using CTRL-Z - 2612 7.2.131 using wrong cursor highlighting after clearing 'keymap' - 7823 7.2.132 accessing freed memory when changing dir in SwapExists autocmd - 1665 7.2.133 ":diffoff!" changes settings in windows not in diff mode - 2314 7.2.134 compiler warnings for discarding "const" from pointer - 1991 7.2.135 memory leak when redefining user command with complete arg - 1326 7.2.136 (after 7.2.132) ":cd" still possible in SwapExists autocmd - 11328 7.2.137 wrong left shift of blockwise selection in tab when 've' set - 5428 7.2.138 extra part of 7.2.137 - 2229 7.2.139 crash when 'virtualedit' is "all" - 1974 7.2.140 diff highlighting missing if Visual area starts at cursor pos - 6622 7.2.141 fixing bold spill redraws too many characters - 1753 7.2.142 Motif and Athena balloons don't use tooltip colors - 6830 7.2.143 no command line completion for ":cscope" command - 2304 7.2.144 colorscheme is reloaded when 't_Co' is set to the same value - 3379 7.2.145 white space in ":cscope find" is not ignored - 3394 7.2.146 v:warningmsg isn't used for all warnings - 1548 7.2.147 cursor in wrong position after Tab for small version - 4275 7.2.148 highlighting a character after the line doesn't always work - 15646 7.2.149 read uninit memory when using return value that wasn't set - 35686 7.2.150 (extra) VisVim doesn't support tabs - 1533 7.2.151 ":hist a" doesn't work like ":hist all" as the docs suggest - 2963 7.2.152 "silent echo x" inside ":redir" leaves cursor halfway the line - 2908 7.2.153 memory leak for ":recover empty_dir/" - 2390 7.2.154 (after 7.2.132) can still do ":cd" in SwapExists autocmd - 1249 7.2.155 memory leak in ":function /pat" - 5543 7.2.156 no completion for :scscope and :lcscope commands - 4299 7.2.157 illegal memory access when searching in path - 2177 7.2.158 warnings from VisualC compiler - 2478 7.2.159 when $x_includes ends up being "NONE" configure fails - 1353 7.2.160 search pattern not freed on exit when 'rightleft' set - 5400 7.2.161 folds messed up in other tab page - 2363 7.2.162 the quickfix window may get the wrong filetype - 1754 7.2.163 the command line window may get folding - 4089 7.2.164 when 'showbreak' is set wrong Visual block size reported - 1794 7.2.165 FuncUndefined autocmd event argument is expanded like filename - 10538 7.2.166 no completion for ":sign" command - 54715 7.2.167 splint doesn't work well for checking the code (part 1) - 2936 7.2.168 if no ctags program found, "make tags" executes first C file - 35841 7.2.169 fix more splint warnings, define colnr_T to be int - 4481 7.2.170 using b_dev while it was not set - 2261 7.2.171 (after 7.2.169) compiler warnings - 1883 7.2.172 (extra) compiler warning - 17875 7.2.173 use gcc instead of lint to check for unused function arguments - 42277 7.2.174 too many warnings from gcc -Wextra - 1455 7.2.175 compiler warning in OpenBSD - 5956 7.2.176 exceptions for splint are not useful - 57904 7.2.177 more warnings from gcc -Wextra - 3898 7.2.178 using negative value for device number might not always work - 2944 7.2.179 using negative value for device number might not always work -198701 7.2.180 some more compiler warnings when using gcc -Wextra - 49635 7.2.181 some more compiler warnings when using gcc -Wextra - 2128 7.2.182 compilation fails for Motif, gvim with GTK crashes on startup - 52709 7.2.183 configure problem for sys/sysctl.h on OpenBSD - 84846 7.2.184 some more compiler warnings when using gcc -Wextra - 8242 7.2.185 some more compiler warnings when using gcc -Wextra - 7260 7.2.186 some more compiler warnings when using gcc -Wextra - 3334 7.2.187 (after 7.2.186) doesn't compile with older tcl versions - 8531 7.2.188 crash with specific use of function calls - 2889 7.2.189 possible hang for deleting auto-indent - 4827 7.2.190 the register executed by @@ isn't stored in viminfo -106448 7.2.191 Mzscheme interface doesn't work on Ubuntu - 4206 7.2.192 (after 7.2.188) still a crash in the garbage collector - 1545 7.2.193 warning for uninitialized values in struct - 1345 7.2.194 (extra) MSVC: rem commands are echoed - 2229 7.2.195 leaking memory for the command Vim was started with - 3466 7.2.196 remove support for splint, it doesn't work well - 1530 7.2.197 warning for uninitialized values of typebuf - 2006 7.2.198 buffer used for termcap entry may be too small - 1894 7.2.199 strange character in comment - 10318 7.2.200 reading past string end when using menu bar or resizing window - 14460 7.2.201 cannot copy/paste HTML to/from Firefox via the clipboard - 1846 7.2.202 BufWipeout autocmd that edits another buffer causes problems - 40481 7.2.203 using current window to work on hidden buffer has side effects - 4407 7.2.204 (extra) Win32: Can't build with Visual Studio 2010 beta 1 - 2852 7.2.205 (extra) Win32: No support for High DPI awarenes - 1485 7.2.206 Win32: Can't build netbeans interface with Visual Studio 2010 - 2237 7.2.207 using freed memory when ":redrawstatus" works recursively - 2569 7.2.208 "set novice" gives an error message, it should be ignored - 2532 7.2.209 for xxd setmode() is undefined on Cygwin - 1896 7.2.210 warning for file changed outside of vim even after :checktime - 1639 7.2.211 memory leak when expanding a series of file names - 1727 7.2.212 (extra) warnings for redefining SIG macros - 1521 7.2.213 warning for using vsprintf() - 1983 7.2.214 crash with complete function for user command - 8298 7.2.215 ml_get error when using ":vimgrep" - 4822 7.2.216 two error messages have the same number E812 - 2020 7.2.217 running tests with valgrind doesn't work as advertised - 1448 7.2.218 cannot build GTK with hangul_input feature - 2052 7.2.219 (extra) Photon GUI is outdated - 2958 7.2.220 (after 7.2.215) BufEnter "cd" autocommand causes problems - 7103 7.2.221 X cut_buffer0 text may be used in the wrong encoding - 1816 7.2.222 ":mksession" doesn't work properly with 'acd' set - 5132 7.2.223 a script run with ":silent" cannot give any messages - 2542 7.2.224 crash when using 'completefunc' - 2874 7.2.225 when using ":normal" a saved character may be executed - 7470 7.2.226 ml_get error after deleting the last line - 1574 7.2.227 when using ":cd" in a script there is no way to track this - 14946 7.2.228 cscope is limited to 8 connections - 1595 7.2.229 warning for shadowed variable - 2442 7.2.230 a few old lint-style ARGUSED comments - 1473 7.2.231 warning for unreacheable code in Perl interface - 2704 7.2.232 cannot debug problems with being in a wrong directory - 2901 7.2.233 extra part of 7.2.232 - 3831 7.2.234 it is not possible to ignore file names without a suffix - 2696 7.2.235 Using CTRL-O z= in Insert mode has a delay before redrawing - 2809 7.2.236 Mac: Compiling with Ruby doesn't always work - 1965 7.2.237 crash on exit when window icon not set - 3941 7.2.238 leaking memory when setting term to "builtin_dumb" - 4151 7.2.239 using :diffpatch twice may cause a crash - 2078 7.2.240 crash when using GUI find/replace dialog repeatedly - 5174 7.2.241 problems with using ":bufdo" and "doautoall" or ":vimgrep" - 2505 7.2.242 setting 'lazyredraw' causes the cursor column to be recomputed - 1918 7.2.243 memory leak when using :vimgrep and resizing - 4757 7.2.244 insufficient info for a conversion error from utf-8 to latin1 - 5093 7.2.245 wrong conversion when writing Unicode encoded files - 1848 7.2.246 Cscope home page link is wrong - 2561 7.2.247 Mzscheme interface minor problem - 4408 7.2.248 (extra) Win32: Mzscheme interface building minor problems - 1555 7.2.249 script that checks .po files can't handle '%' in plural forms - 1693 7.2.250 (extra) possible buffer overflow in GvimExt - 2802 7.2.251 compiler adds invalid memory bounds check - 1495 7.2.252 when 'enc' is multi-byte 'iskeyword' can't contain chars > 128 - 4223 7.2.253 netbeans interface: getLength always uses current buffer - 1654 7.2.254 compiler warning for assigning size_t to int - 1870 7.2.255 (after 7.2.242) cursor column may be wrong after :set - 1783 7.2.256 GTK font dialog doesn't have a default when 'guifont' not set - 2092 7.2.257 GTK 2.17: lots of assertion error messages - 1989 7.2.258 v:beval_col and b:beval_text are wrong in UTF-8 text - 5393 7.2.259 exists() doesn't work properly for an empty aucmd group - 5431 7.2.260 (extra part of 7.2.259) - 2515 7.2.261 E38 may appear when deleting folded lines - 5652 7.2.262 string passed to user cmd custom completion can be too long - 2634 7.2.263 GTK2: Vim window in wrong position using the -geom argument - 5161 7.2.264 GTK2: When Vim window maximized, set 'columns' doesn't work - 1892 7.2.265 with ":silent broken" inside try/catch silency may persist - 6560 7.2.266 in an expression abbreviation the typed character is unknown - 1461 7.2.267 crash for narrow window and double-width character - 2274 7.2.268 crash when using Python to set cursor beyond end of line - 7128 7.2.269 add --startuptime so that slow startup can be analysed - 2281 7.2.270 ":@c" does not execute everything if the c register has a CR - 2649 7.2.271 Motif GUI: Using freed memory when making a choice - 2582 7.2.272 "_.svz" is not recognized as a swap file - 3404 7.2.273 crash when redirirecting to unknown array - 3749 7.2.274 syntax folding doesn't work properly when adding a comment - 2717 7.2.275 warning for unused argument and comparing signed and unsigned - 1875 7.2.276 crash when setting 'isprint' to a small bullet - 1937 7.2.277 CTRL-Y in a diff'ed window may move cursor outside of window - 2312 7.2.278 using magic number in the folding code - 3413 7.2.279 invalid memory read with visual mode "r" - 6656 7.2.280 a redraw in a custom statusline with %! may cause a crash - 2241 7.2.281 'cursorcolumn' highlighting is wrong in diff mode - 1584 7.2.282 a fold can't be closed - 2030 7.2.283 GTK: changing font doesn't keep the window maximized - 1572 7.2.284 two windows on a buffer + folding: display error after change - 1931 7.2.285 (after 7.2.169) CTRL-U in Insert mode also deletes indent - 7058 7.2.286 (after 7.2.269) --startuptime argument is not consistent - 1733 7.2.287 warning from gcc 3.4 about uninitialized variable - 1680 7.2.288 Python 2.6 pyconfig.h redefines macros - 3979 7.2.289 checking wrong struct member - 5344 7.2.290 not freeing memory from ":lmap", ":xmap" and ":menutranslate" - 1498 7.2.291 reading uninitialised memory in arabic mode - 1518 7.2.292 block right-shift wrong with multibyte encoding and 'list' set - 1954 7.2.293 when setting 'comments' option it may be used in a wrong way - 8992 7.2.294 when using TEMPDIRS dir name could get too long - 4053 7.2.295 in map() on a List the index is not known, set v:key to index - 1809 7.2.296 (after 7.2.286) help message about startuptime is wrong - 1846 7.2.297 reading freed memory when writing ":reg" output to a register - 1608 7.2.298 ":vimgrep" crashes with an autocommand that sets w: variable - 1733 7.2.299 crash when comment middle is longer than start - 5886 7.2.300 file descriptors not closed when executing external command - 14601 7.2.301 formatting is wrong when 'tw' is set to a small value - 4941 7.2.302 (extra, after 7.2.301) extra part of the 7.2.301 tests - 2073 7.2.303 (after 7.2.294) can't build on MS-Windows - 1831 7.2.304 compiler warning for bad pointer cast - 2727 7.2.305 recursively redrawing causes a memory leak - 1541 7.2.306 shellescape("10%%", 1) only escapes first % - 4869 7.2.307 crash with a very long syntax match statement - 5504 7.2.308 submatch() in "\=" of ":s" command returns empty string - 1533 7.2.309 (after 7.2.308) warning for missing function prototype - 1874 7.2.310 ftdetect plugin using ":setf" doesn't work with # comment - 1408 7.2.311 can't compile with FreeMiNT - 9769 7.2.312 iconv() returns invalid char sequence when conversion fails - 3744 7.2.313 command line completion doesn't work after "%:h" and similar - 1620 7.2.314 small build broken after 7.2.313 - 4605 7.2.315 Python libs can't be found on 64 bit system - 3370 7.2.316 may get multiple _FORTIFY_SOURCE arguments - 5249 7.2.317 memory leak when adding a highlight group resulting in E669 - 2637 7.2.318 wrong locale value breaks floating point numbers for gvim - 1846 7.2.319 Motif: accessing freed memory when cancelling font dialog - 6269 7.2.320 unused function in Mzscheme interface - 1899 7.2.321 histadd() and "*" fail to add entry to empty history - 1517 7.2.322 wrong indenting in virtual replace for CTRL-Y and a short line - 2424 7.2.323 (extra) balloon evaluation crashes on Win64 - 1901 7.2.324 a negative column argument in setpos() may cause a crash - 1616 7.2.325 stray "w" in the startup vimrc file makes edited file empty - 1790 7.2.326 Win32: $HOME doesn't work when %HOMEPATH% is not defined - 7899 7.2.327 unused functions in Workshop - 1453 7.2.328 has("win64") does not return 1 on 64 bit MS-Windows version - 1390 7.2.329 cursor pos wrong after "g_" in Visual mode and excl. selection - 45468 7.2.330 tables for Unicode case operators are outdated - 1385 7.2.331 can't interrupt "echo list" for a very long list - 3492 7.2.332 crash if spell correcting triggers autocmd to reload a buffer - 10075 7.2.333 warnings from static code analysis - 9095 7.2.334 postponing keys in Netbeans interface does not work properly - 2802 7.2.335 the CTRL-] command escapes too many characters - 26204 7.2.336 MzScheme interface can't evaluate an expression - 3828 7.2.337 ":compiler" doesn't function properly in a function - 3535 7.2.338 (after 7.2.300) part of FD_CLOEXEC change is missing - 1977 7.2.339 (after 7.2.269) part of --startuptime patch is missing - 1587 7.2.340 gcc warning for condition that can never be true - 2072 7.2.341 popup menu wraps to next line if wide character doesn't fit - 2507 7.2.342 popup menu wrong in 'rightleft' mode with multi-byte chars - 1370 7.2.343 (after 7.2.338) can't compile on Win32 - 1728 7.2.344 (after 7.2.338) can't compile on some systems - 1324 7.2.345 tab line is not updated when the value of 'bt' is changed - 2895 7.2.346 repeating a command with @: causes mapping to be applied twice - 3784 7.2.347 crash when executing <expr> mapping redefines that mapping - 7230 7.2.348 (after 7.2.330) Unicode double width table is outdated - 1714 7.2.349 CTRL-W gf puts the new tab in the wrong place - 2766 7.2.350 Win32: When changing font window may jump to another screen - 2195 7.2.351 (after 7.2.347) compilation fails with some compilers - 1825 7.2.352 Win64: Vim doesn't work when cross-compiled with MingW libs - 4764 7.2.353 no command line completion for ":profile" - 2270 7.2.354 Japanese single-width double-byte chars not handled correctly - 2663 7.2.355 popup menu in wrong position when 'number' is set - 2166 7.2.356 not all folds are closed when 'foldmethod' is changed - 1565 7.2.357 CR displayed wrong when changing 'fileformat' from/to "mac" - 2384 7.2.358 compiler warnings on VMS - 1805 7.2.359 crash when using the Netbeans join command - 2839 7.2.360 Ruby on MS-Windows: can't use sockets - 23442 7.2.361 Ruby 1.9 is not supported - 2964 7.2.362 (extra, after 7.2.352) Win64 cross-compile problems - 2521 7.2.363 Perl 5.10 dynamic loading doesn't work - 2958 7.2.364 (extra) can't build gvimext.dll on Win 7 x64 using MinGW - 2390 7.2.365 (extra) MS-Windows with MingW: "File->Save As" does not work - 3802 7.2.366 CTRL-B doesn't go back to the first line of the buffer - 3236 7.2.367 "xxd -r -p" doesn't work as documented - 1623 7.2.368 (after 7.2.361) append line with Ruby interface doesn't work - 1872 7.2.369 error message for :profile is not easy to understand - 4352 7.2.370 (after 7.2.356) a redraw may cause folds to be closed - 10029 7.2.371 build problems on Tandem NonStop - 9674 7.2.372 (extra) cross-compiling GvimExt and xxd doesn't work. - 2901 7.2.373 new messages from gcc 4.5 are not in 'errorformat' - 4434 7.2.374 Ruby eval() doesn't understand Vim types - 1794 7.2.375 ml_get errors when using ":bprevious" in a BufEnter autocmd - 1577 7.2.376 ml_get error when using SiSU syntax - 1983 7.2.377 (extra, after 7.2.372) small mistakes in Ming build file - 2832 7.2.378 C function declaration indented too much - 1758 7.2.379 'eventignore' is set to an invalid value inside ":doau" - 3699 7.2.380 (after 7.2.363) Perl builds with 5.10.1 but not with 5.10.0 - 6835 7.2.381 no completion for :behave - 1766 7.2.382 close cmdline window when 'bufhide' is "wipe" uses freed mem - 3021 7.2.383 Vim doesn't build cleanly with MSVC 2010 - 1849 7.2.384 (extra) Vim doesn't build properly with MSVC 2010 - 2147 7.2.385 can't drag status line when in the command line window - 2051 7.2.386 KDE 3.1 focus hack causes problems for other window managers - 8233 7.2.387 Ruby with MingW still doesn't build all versions - 2486 7.2.388 (extra part of 7.2.387) Ruby with MingW - 4805 7.2.389 synIDattr() cannot return the font - 2302 7.2.390 in some situations the popup menu can be displayed wrong - 3426 7.2.391 internal alloc(0) error when doing "CTRL-V $ c" - 4898 7.2.392 netbeans hangs reading from a socket at the maximum block size - 9605 7.2.393 Mac: Can't build with different Xcode developer tools dir - 4298 7.2.394 .lzma and .xz files are not supported - 1554 7.2.395 in help CTRL=] on g?g? escapes the ?, causing it to fail - 1554 7.2.396 get E38 errors - 1722 7.2.397 redundant check for w_lines_valid - 4127 7.2.398 when moving windows the cursor ends up in the wrong line - 1784 7.2.399 (extra, after 7.2.388) cannot compile on MingW - 12865 7.2.400 (after 7.2.387) Ruby problems with init and empty string - 1982 7.2.401 wildmode list doesn't highlight directory names with a space - 2649 7.2.402 error 705 when re-using funcref variable - 1548 7.2.403 (after 7.2.400) compiler warning for pointer type - 1880 7.2.404 pointers for composing characters are not properly initialized - 1636 7.2.405 with small features match is not highlighted for ":s/p/r/c" - 4701 7.2.406 (after 7.2.119) uninit memory read - 1916 7.2.407 when using :s with an expression backslashes are dropped - 2152 7.2.408 ":g/the/s/a/b/" can set '[ and '] marks to an unchanged line - 1814 7.2.409 summary of number of substitutes is incorrect for ":folddo" - 2526 7.2.410 highlighting directories for completion doesn't work properly - 1462 7.2.411 when parsing 'cino' a comma isn't skipped properly - ---- vim72.orig/Filelist -+++ vim72/Filelist -@@ -283,10 +283,11 @@ SRC_DOS = \ - src/proto/os_msdos.pro \ - src/proto/os_win16.pro \ - src/proto/os_win32.pro \ - src/proto/os_mswin.pro \ - src/testdir/Make_dos.mak \ -+ src/testdir/Make_ming.mak \ - src/testdir/dos.vim \ - src/uninstal.c \ - src/vim.def \ - src/vim.rc \ - src/vimio.h \ -@@ -680,13 +681,11 @@ LANG_GEN = \ - runtime/spell/README.txt \ - runtime/spell/??/*.diff \ - runtime/spell/??/main.aap \ - runtime/spell/yi/README.txt \ - runtime/spell/main.aap \ -- runtime/spell/cleanadd.vim \ - runtime/spell/*.vim \ -- runtime/spell/fixdup \ - - # generic language files, binary - LANG_GEN_BIN = \ - runtime/spell/README_en.txt \ - runtime/spell/en.ascii.spl \ ---- vim72.orig/runtime/doc/autocmd.txt -+++ vim72/runtime/doc/autocmd.txt -@@ -333,10 +333,12 @@ BufDelete Before deleting a buffer fro - Also used just before a buffer in the buffer - list is renamed. - NOTE: When this autocommand is executed, the - current buffer "%" may be different from the - buffer being deleted "<afile>" and "<abuf>". -+ Don't change to another buffer, it will cause -+ problems. - *BufEnter* - BufEnter After entering a buffer. Useful for setting - options for a file type. Also executed when - starting to edit a buffer, after the - BufReadPost autocommands. -@@ -395,10 +397,12 @@ BufUnload Before unloading a buffer. - BufDelete. Also used for all buffers that are - loaded when Vim is going to exit. - NOTE: When this autocommand is executed, the - current buffer "%" may be different from the - buffer being unloaded "<afile>". -+ Don't change to another buffer, it will cause -+ problems. - *BufWinEnter* - BufWinEnter After a buffer is displayed in a window. This - can be when the buffer is loaded (after - processing the modelines) or when a hidden - buffer is displayed in a window (and is no -@@ -426,10 +430,12 @@ BufWipeout Before completely deleting - is renamed (also when it's not in the buffer - list). - NOTE: When this autocommand is executed, the - current buffer "%" may be different from the - buffer being deleted "<afile>". -+ Don't change to another buffer, it will cause -+ problems. - *BufWrite* *BufWritePre* - BufWrite or BufWritePre Before writing the whole buffer to a file. - *BufWriteCmd* - BufWriteCmd Before writing the whole buffer to a file. - Should do the writing of the file and reset -@@ -746,12 +752,14 @@ SwapExists Detected an existing swap f - 'd' delete the swap file - 'q' quit, don't edit the file - 'a' abort, like hitting CTRL-C - When set to an empty string the user will be - asked, as if there was no SwapExists autocmd. -- Note: Do not try to change the buffer, the -- results are unpredictable. -+ *E812* -+ It is not allowed to change to another buffer, -+ change a buffer name or change directory -+ here. - *Syntax* - Syntax When the 'syntax' option has been set. The - pattern is matched against the syntax name. - <afile> can be used for the name of the file - where this option was set, and <amatch> for ---- vim72.orig/runtime/doc/cmdline.txt -+++ vim72/runtime/doc/cmdline.txt -@@ -1,6 +1,6 @@ --*cmdline.txt* For Vim version 7.2. Last change: 2008 Jul 29 -+*cmdline.txt* For Vim version 7.2. Last change: 2008 Sep 18 - - - VIM REFERENCE MANUAL by Bram Moolenaar - - -@@ -155,10 +155,15 @@ CTRL-R {0-9a-z"%#:-=.} *c_CTRL-R* *c - '=' the expression register: you are prompted to - enter an expression (see |expression|) - (doesn't work at the expression prompt; some - things such as changing the buffer or current - window are not allowed to avoid side effects) -+ When the result is a |List| the items are used -+ as lines. They can have line breaks inside -+ too. -+ When the result is a Float it's automatically -+ converted to a String. - See |registers| about registers. {not in Vi} - Implementation detail: When using the |expression| register - and invoking setcmdpos(), this sets the position before - inserting the resulting string. Use CTRL-R CTRL-R to set the - position afterwards. -@@ -434,17 +439,24 @@ matching files with the next. - For file name completion you can use the 'suffixes' option to set a priority - between files with almost the same name. If there are multiple matches, - those files with an extension that is in the 'suffixes' option are ignored. - The default is ".bak,~,.o,.h,.info,.swp,.obj", which means that files ending - in ".bak", "~", ".o", ".h", ".info", ".swp" and ".obj" are sometimes ignored. --It is impossible to ignore suffixes with two dots. Examples: -+ -+An empty entry, two consecutive commas, match a file name that does not -+contain a ".", thus has no suffix. This is useful to ignore "prog" and prefer -+"prog.c". -+ -+Examples: - - pattern: files: match: ~ - test* test.c test.h test.o test.c - test* test.h test.o test.h and test.o - test* test.i test.h test.c test.i and test.c - -+It is impossible to ignore suffixes with two dots. -+ - If there is more than one matching file (after ignoring the ones matching - the 'suffixes' option) the first file name is inserted. You can see that - there is only one match when you type 'wildchar' twice and the completed - match stays the same. You can get to the other matches by entering - 'wildchar', CTRL-N or CTRL-P. All files are included, also the ones with -@@ -728,23 +740,33 @@ to use |fnameescape()|. - - - In Ex commands, at places where a file name can be used, the following - characters have a special meaning. These can also be used in the expression - function expand() |expand()|. -- % is replaced with the current file name *:_%* -- # is replaced with the alternate file name *:_#* -+ % Is replaced with the current file name. *:_%* *c_%* -+ # Is replaced with the alternate file name. *:_#* *c_#* - #n (where n is a number) is replaced with the file name of -- buffer n. "#0" is the same as "#" -- ## is replaced with all names in the argument list *:_##* -+ buffer n. "#0" is the same as "#". -+ ## Is replaced with all names in the argument list *:_##* *c_##* - concatenated, separated by spaces. Each space in a name - is preceded with a backslash. --Note that these give the file name as it was typed. If an absolute path is --needed (when using the file name from a different directory), you need to add --":p". See |filename-modifiers|. -+ #<n (where n is a number > 0) is replaced with old *:_#<* *c_#<* -+ file name n. See |:oldfiles| or |v:oldfiles| to get the -+ number. *E809* -+ {only when compiled with the +eval and +viminfo features} -+ -+Note that these, except "#<n", give the file name as it was typed. If an -+absolute path is needed (when using the file name from a different directory), -+you need to add ":p". See |filename-modifiers|. -+ -+The "#<n" item returns an absolute path, but it will start with "~/" for files -+below your home directory. -+ - Note that backslashes are inserted before spaces, so that the command will - correctly interpret the file name. But this doesn't happen for shell --commands. For those you probably have to use quotes: > -+commands. For those you probably have to use quotes (this fails for files -+that contain a quote and wildcards): > - :!ls "%" - :r !spell "%" - - To avoid the special meaning of '%' and '#' insert a backslash before it. - Detail: The special meaning is always escaped when there is a backslash before ---- vim72.orig/runtime/doc/eval.txt -+++ vim72/runtime/doc/eval.txt -@@ -1,6 +1,6 @@ --*eval.txt* For Vim version 7.2. Last change: 2008 Aug 09 -+*eval.txt* For Vim version 7.2. Last change: 2008 Nov 27 - - - VIM REFERENCE MANUAL by Bram Moolenaar - - -@@ -1482,10 +1482,21 @@ v:mouse_lnum Line number for a mouse cli - *v:mouse_col* *mouse_col-variable* - v:mouse_col Column number for a mouse click obtained with |getchar()|. - This is the screen column number, like with |virtcol()|. The - value is zero when there was no mouse button click. - -+ *v:oldfiles* *oldfiles-variable* -+v:oldfiles List of file names that is loaded from the |viminfo| file on -+ startup. These are the files that Vim remembers marks for. -+ The length of the List is limited by the ' argument of the -+ 'viminfo' option (default is 100). -+ Also see |:oldfiles| and |c_#<|. -+ The List can be modified, but this has no effect on what is -+ stored in the |viminfo| file later. If you use values other -+ than String this will cause trouble. -+ {only when compiled with the +viminfo feature} -+ - *v:operator* *operator-variable* - v:operator The last operator given in Normal mode. This is a single - character except for commands starting with <g> or <z>, - in which case it is two characters. Best used alongside - |v:prevcount| and |v:register|. Useful if you want to cancel -@@ -1693,11 +1704,11 @@ eval( {string}) any evaluate {string} - eventhandler( ) Number TRUE if inside an event handler - executable( {expr}) Number 1 if executable {expr} exists - exists( {expr}) Number TRUE if {expr} exists - extend({expr1}, {expr2} [, {expr3}]) - List/Dict insert items of {expr2} into {expr1} --expand( {expr}) String expand special keywords in {expr} -+expand( {expr} [, {flag}]) String expand special keywords in {expr} - feedkeys( {string} [, {mode}]) Number add key sequence to typeahead buffer - filereadable( {file}) Number TRUE if {file} is a readable file - filewritable( {file}) Number TRUE if {file} is a writable file - filter( {expr}, {string}) List/Dict remove items from {expr} where - {string} is 0 -@@ -1745,12 +1756,13 @@ getregtype( [{regname}]) String type of - gettabwinvar( {tabnr}, {winnr}, {name}) - any {name} in {winnr} in tab page {tabnr} - getwinposx() Number X coord in pixels of GUI Vim window - getwinposy() Number Y coord in pixels of GUI Vim window - getwinvar( {nr}, {varname}) any variable {varname} in window {nr} --glob( {expr}) String expand file wildcards in {expr} --globpath( {path}, {expr}) String do glob({expr}) for all dirs in {path} -+glob( {expr} [, {flag}]) String expand file wildcards in {expr} -+globpath( {path}, {expr} [, {flag}]) -+ String do glob({expr}) for all dirs in {path} - has( {feature}) Number TRUE if feature {feature} supported - has_key( {dict}, {key}) Number TRUE if {dict} has entry {key} - haslocaldir() Number TRUE if current window executed |:lcd| - hasmapto( {what} [, {mode} [, {abbr}]]) - Number TRUE if mapping to {what} exists -@@ -1801,15 +1813,16 @@ matchend( {expr}, {pat}[, {start}[, {cou - Number position where {pat} ends in {expr} - matchlist( {expr}, {pat}[, {start}[, {count}]]) - List match and submatches of {pat} in {expr} - matchstr( {expr}, {pat}[, {start}[, {count}]]) - String {count}'th match of {pat} in {expr} --max({list}) Number maximum value of items in {list} --min({list}) Number minimum value of items in {list} --mkdir({name} [, {path} [, {prot}]]) -+max( {list}) Number maximum value of items in {list} -+min( {list}) Number minimum value of items in {list} -+mkdir( {name} [, {path} [, {prot}]]) - Number create directory {name} - mode( [expr]) String current editing mode -+mzeval( {expr}) any evaluate |MzScheme| expression - nextnonblank( {lnum}) Number line nr of non-blank line >= {lnum} - nr2char( {expr}) String single char with ASCII value {expr} - pathshorten( {expr}) String shorten directory names in a path - pow( {x}, {y}) Float {x} to the power of {y} - prevnonblank( {lnum}) Number line nr of non-blank line <= {lnum} -@@ -2400,10 +2413,11 @@ cursor({list}) - line. - If {col} is zero, the cursor will stay in the current column. - When 'virtualedit' is used {off} specifies the offset in - screen columns from the start of the character. E.g., a - position within a <Tab> or after the last character. -+ Returns 0 when the position could be set, -1 otherwise. - - - deepcopy({expr}[, {noref}]) *deepcopy()* *E698* - Make a copy of {expr}. For Numbers and Strings this isn't - different from using {expr} directly. -@@ -3273,18 +3287,20 @@ getwinvar({winnr}, {varname}) *getwin - Like |gettabwinvar()| for the current tabpage. - Examples: > - :let list_is_on = getwinvar(2, '&list') - :echo "myvar = " . getwinvar(1, 'myvar') - < -- *glob()* --glob({expr}) Expand the file wildcards in {expr}. See |wildcards| for the -+glob({expr} [, {flag}]) *glob()* -+ Expand the file wildcards in {expr}. See |wildcards| for the - use of special characters. - The result is a String. - When there are several matches, they are separated by <NL> - characters. -- The 'wildignore' option applies: Names matching one of the -- patterns in 'wildignore' will be skipped. -+ Unless the optional {flag} argument is given and is non-zero, -+ the 'suffixes' and 'wildignore' options apply: Names matching -+ one of the patterns in 'wildignore' will be skipped and -+ 'suffixes' affect the ordering of matches. - If the expansion fails, the result is an empty string. - A name for a non-existing file is not included. - - For most systems backticks can be used to get files names from - any external command. Example: > -@@ -3294,24 +3310,26 @@ glob({expr}) Expand the file wildcards i - item per line. Spaces inside an item are allowed. - - See |expand()| for expanding special Vim variables. See - |system()| for getting the raw output of an external command. - --globpath({path}, {expr}) *globpath()* -+globpath({path}, {expr} [, {flag}]) *globpath()* - Perform glob() on all directories in {path} and concatenate - the results. Example: > - :echo globpath(&rtp, "syntax/c.vim") - < {path} is a comma-separated list of directory names. Each - directory name is prepended to {expr} and expanded like with -- glob(). A path separator is inserted when needed. -+ |glob()|. A path separator is inserted when needed. - To add a comma inside a directory name escape it with a - backslash. Note that on MS-Windows a directory may have a - trailing backslash, remove it if you put a comma after it. - If the expansion fails for one of the directories, there is no - error message. -- The 'wildignore' option applies: Names matching one of the -- patterns in 'wildignore' will be skipped. -+ Unless the optional {flag} argument is given and is non-zero, -+ the 'suffixes' and 'wildignore' options apply: Names matching -+ one of the patterns in 'wildignore' will be skipped and -+ 'suffixes' affect the ordering of matches. - - The "**" item can be used to search in a directory tree. - For example, to find all "README.txt" files in the directories - in 'runtimepath' and below: > - :echo globpath(&rtp, "**/README.txt") -@@ -3783,11 +3801,12 @@ log10({expr}) *log10()* - map({expr}, {string}) *map()* - {expr} must be a |List| or a |Dictionary|. - Replace each item in {expr} with the result of evaluating - {string}. - Inside {string} |v:val| has the value of the current item. -- For a |Dictionary| |v:key| has the key of the current item. -+ For a |Dictionary| |v:key| has the key of the current item -+ and for a |List| |v:key| has the index of the current item. - Example: > - :call map(mylist, '"> " . v:val . " <"') - < This puts "> " before and " <" after each item in "mylist". - - Note that {string} is the result of an expression and is then -@@ -4070,10 +4089,27 @@ mode([expr]) Return a string that indica - This is useful in the 'statusline' option or when used - with |remote_expr()| In most other places it always returns - "c" or "n". - Also see |visualmode()|. - -+mzeval({expr}) *mzeval()* -+ Evaluate MzScheme expression {expr} and return its result -+ convert to Vim data structures. -+ Numbers and strings are returned as they are. -+ Pairs (including lists and improper lists) and vectors are -+ returned as Vim |Lists|. -+ Hash tables are represented as Vim |Dictionary| type with keys -+ converted to strings. -+ All other types are converted to string with display function. -+ Examples: > -+ :mz (define l (list 1 2 3)) -+ :mz (define h (make-hash)) (hash-set! h "list" l) -+ :echo mzeval("l") -+ :echo mzeval("h") -+< -+ {only available when compiled with the |+mzscheme| feature} -+ - nextnonblank({lnum}) *nextnonblank()* - Return the line number of the first line at or below {lnum} - that is not blank. Example: > - if getline(nextnonblank(1)) =~ "Java" - < When {lnum} is invalid or there is no non-blank line at or -@@ -4498,10 +4534,11 @@ remove({dict}, {key}) - rename({from}, {to}) *rename()* - Rename the file by the name {from} to the name {to}. This - should also work to move files across file systems. The - result is a Number, which is 0 if the file was renamed - successfully, and non-zero when the renaming failed. -+ NOTE: If {to} exists it is overwritten without warning. - This function is not available in the |sandbox|. - - repeat({expr}, {count}) *repeat()* - Repeat {expr} {count} times and return the concatenated - result. Example: > -@@ -5330,18 +5367,23 @@ synIDattr({synID}, {what} [, {mode}]) - {what} result - "name" the name of the syntax item - "fg" foreground color (GUI: color name used to set - the color, cterm: color number as a string, - term: empty string) -- "bg" background color (like "fg") -+ "bg" background color (as with "fg") -+ "font" font name (only available in the GUI) -+ |highlight-font| -+ "sp" special color (as with "fg") |highlight-guisp| - "fg#" like "fg", but for the GUI and the GUI is - running the name in "#RRGGBB" form - "bg#" like "fg#" for "bg" -+ "sp#" like "fg#" for "sp" - "bold" "1" if bold - "italic" "1" if italic - "reverse" "1" if reverse - "inverse" "1" if inverse (= reverse) -+ "standout" "1" if standout - "underline" "1" if underlined - "undercurl" "1" if undercurled - - Example (echoes the color of the syntax item under the - cursor): > -@@ -5821,11 +5863,12 @@ mouse_dec Compiled with support for Dec - mouse_gpm Compiled with support for gpm (Linux console mouse) - mouse_netterm Compiled with support for netterm mouse. - mouse_pterm Compiled with support for qnx pterm mouse. - mouse_sysmouse Compiled with support for sysmouse (*BSD console mouse) - mouse_xterm Compiled with support for xterm mouse. --multi_byte Compiled with support for editing Korean et al. -+multi_byte Compiled with support for 'encoding' -+multi_byte_encoding 'encoding' is set to a multi-byte encoding. - multi_byte_ime Compiled with support for IME input method. - multi_lang Compiled with support for multiple languages. - mzscheme Compiled with MzScheme interface |mzscheme|. - netbeans_intg Compiled with support for |netbeans|. - netbeans_enabled Compiled with support for |netbeans| and it's used. -@@ -5846,10 +5889,11 @@ ruby Compiled with Ruby interface |rub - scrollbind Compiled with 'scrollbind' support. - showcmd Compiled with 'showcmd' support. - signs Compiled with |:sign| support. - smartindent Compiled with 'smartindent' support. - sniff Compiled with SNiFF interface support. -+startuptime Compiled with |--startuptime| support. - statusline Compiled with support for 'statusline', 'rulerformat' - and special formats of 'titlestring' and 'iconstring'. - sun_workshop Compiled with support for Sun |workshop|. - spell Compiled with spell checking support |spell|. - syntax Compiled with syntax highlighting support |syntax|. ---- vim72.orig/runtime/doc/if_cscop.txt -+++ vim72/runtime/doc/if_cscop.txt -@@ -1,6 +1,6 @@ --*if_cscop.txt* For Vim version 7.2. Last change: 2005 Mar 29 -+*if_cscop.txt* For Vim version 7.2. Last change: 2009 Mar 18 - - - VIM REFERENCE MANUAL by Andy Kahn - - *cscope* *Cscope* -@@ -129,15 +129,26 @@ The available subcommands are: - 4 or t: Find this text string - 6 or e: Find this egrep pattern - 7 or f: Find this file - 8 or i: Find files #including this file - -+ For all types, except 4 and 6, leading white space for {name} is -+ removed. For 4 and 6 there is exactly one space between {querytype} -+ and {name}. Further white space is included in {name}. -+ - EXAMPLES > - :cscope find c vim_free -- :cscope find 3 vim_free -+ :cscope find 3 vim_free -+< -+ These two examples perform the same query: functions calling -+ "vim_free". > -+ -+ :cscope find t initOnce -+ :cscope find t initOnce - < -- These two examples perform the same query. > -+ The first one searches for the text "initOnce", the second one for -+ " initOnce". > - - :cscope find 0 DEFAULT_TERM - < - Executing this example on the source code for Vim 5.1 produces the - following output: -@@ -342,17 +353,12 @@ cscope version for Win32 see: - http://iamphet.nm.ru/cscope/index.html - - The DJGPP-built version from http://cscope.sourceforge.net is known to not - work with Vim. - --There are a couple of hard-coded limitations: -- -- 1. The maximum number of cscope connections allowed is 8. Do you -- really need more? -- -- 2. Doing a |:tjump| when |:cstag| searches the tag files is not -- configurable (e.g., you can't do a tselect instead). -+Hard-coded limitation: doing a |:tjump| when |:cstag| searches the tag files -+is not configurable (e.g., you can't do a tselect instead). - - ============================================================================== - 6. Suggested usage *cscope-suggestions* - - Put these entries in your .vimrc (adjust the pathname accordingly to your -@@ -473,11 +479,12 @@ The cscope interface/support for Vim was - Andy Kahn <ackahn@netapp.com>. The original structure (as well as a tiny - bit of code) was adapted from the cscope interface in nvi. Please report - any problems, suggestions, patches, et al., you have for the usage of - cscope within Vim to him. - *cscope-win32* --For a cscope version for Win32 see: http://iamphet.nm.ru/cscope/index.html -+For a cscope version for Win32 see: -+ http://code.google.com/p/cscope-win32/ - - Win32 support was added by Sergey Khorev <sergey.khorev@gmail.com>. Contact - him if you have Win32-specific issues. - - vim:tw=78:ts=8:ft=help:norl: ---- vim72.orig/runtime/doc/if_mzsch.txt -+++ vim72/runtime/doc/if_mzsch.txt -@@ -1,18 +1,19 @@ --*if_mzsch.txt* For Vim version 7.2. Last change: 2008 Jun 28 -+*if_mzsch.txt* For Vim version 7.2. Last change: 2010 Jan 19 - - - VIM REFERENCE MANUAL by Sergey Khorev - - - The MzScheme Interface to Vim *mzscheme* *MzScheme* - - 1. Commands |mzscheme-commands| - 2. Examples |mzscheme-examples| - 3. Threads |mzscheme-threads| --4. The Vim access procedures |mzscheme-vim| --5. Dynamic loading |mzscheme-dynamic| -+4. Vim access from MzScheme |mzscheme-vim| -+5. mzeval() Vim function |mzscheme-mzeval| -+6. Dynamic loading |mzscheme-dynamic| - - {Vi does not have any of these commands} - - The MzScheme interface is available only if Vim was compiled with the - |+mzscheme| feature. -@@ -40,24 +41,18 @@ Note: On FreeBSD you should use the "drs - feature wasn't compiled in. To avoid errors, see - |script-here|. - - *:mzfile* *:mzf* - :[range]mzf[ile] {file} Execute the MzScheme script in {file}. {not in Vi} -- All statements are executed in the namespace of the -- buffer that was current during :mzfile start. -- If you want to access other namespaces, use -- 'parameterize'. - - All of these commands do essentially the same thing - they execute a piece of - MzScheme code, with the "current range" set to the given line - range. - - In the case of :mzscheme, the code to execute is in the command-line. - In the case of :mzfile, the code to execute is the contents of the given file. - --Each buffer has its own MzScheme namespace. Global namespace is bound to --the "global-namespace" value from the 'vimext' module. - MzScheme interface defines exception exn:vim, derived from exn. - It is raised for various Vim errors. - - During compilation, the MzScheme interface will remember the current MzScheme - collection path. If you want to specify additional paths use the -@@ -77,79 +72,68 @@ The exn:vim is available without explici - - To avoid clashes with MzScheme, consider using prefix when requiring module, - e.g.: > - :mzscheme (require (prefix vim- vimext)) - < --All the examples below assume this naming scheme. Note that you need to do --this again for every buffer. -+All the examples below assume this naming scheme. - --The auto-instantiation can be achieved with autocommands, e.g. you can put --something like this in your .vimrc (EOFs should not have indentation): > -- function s:MzRequire() -- if has("mzscheme") -- :mz << EOF -- (require (prefix vim- vimext)) -- (let ((buf (vim-get-buff-by-name (vim-eval "expand(\"<afile>\")")))) -- (when (and buf (not (eq? buf (vim-curr-buff)))) -- (parameterize ((current-namespace (vim-get-buff-namespace buf))) -- (namespace-attach-module vim-global-namespace 'vimext) -- (namespace-require '(prefix vim vimext))))) -- EOF -- endif -- endfunction -- -- function s:MzStartup() -- if has("mzscheme") -- au BufNew,BufNewFile,BufAdd,BufReadPre * :call s:MzRequire() -- :mz << EOF -- (current-library-collection-paths -- (cons -- (build-path (find-system-path 'addon-dir) (version) "collects") -- (current-library-collection-paths))) -- EOF -- endif -- endfunction -- -- call s:MzStartup() --< -- --The global namespace just instantiated this module with the prefix "vimext:". - *mzscheme-sandbox* - When executed in the |sandbox|, access to some filesystem and Vim interface - procedures is restricted. - - ============================================================================== - 2. Examples *mzscheme-examples* - > - :mzscheme (display "Hello") -+ :mz (display (string-append "Using MzScheme version " (version))) -+ :mzscheme (require (prefix vim- vimext)) ; for MzScheme < 4.x -+ :mzscheme (require (prefix-in vim- 'vimext)) ; MzScheme 4.x - :mzscheme (vim-set-buff-line 10 "This is line #10") - < - Inline script usage: > - function! <SID>SetFirstLine() - :mz << EOF - (display "!!!") -+ (require (prefix vim- vimext)) -+ ; for newer versions (require (prefix-in vim- 'vimext)) - (vim-set-buff-line 1 "This is line #1") - (vim-beep) -- EOF -+ EOF - endfunction - - nmap <F9> :call <SID>SetFirstLine() <CR> - < - File execution: > - :mzfile supascript.scm - < --Accessing the current buffer namespace from an MzScheme program running in --another buffer within |:mzfile|-executed script : > -- ; Move to the window below -- (vim-command "wincmd j") -- ; execute in the context of buffer, to which window belongs -- ; assume that buffer has 'textstring' defined -- (parameterize ((current-namespace -- (vim-get-buff-namespace (vim-curr-buff)))) -- (eval '(vim-set-buff-line 1 textstring))) --< -+Vim exception handling: > -+ :mz << EOF -+ (require (prefix vim- vimext)) -+ ; for newer versions (require (prefix-in vim- 'vimext)) -+ (with-handlers -+ ([exn:vim? (lambda (e) (display (exn-message e)))]) -+ (vim-eval "nonsense-string")) -+ EOF -+< -+Auto-instantiation of vimext module (can be placed in your |vimrc|): > -+ function! MzRequire() -+ :redir => l:mzversion -+ :mz (version) -+ :redir END -+ if strpart(l:mzversion, 1, 1) < "4" -+ " MzScheme versions < 4.x: -+ :mz (require (prefix vim- vimext)) -+ else -+ " newer versions: -+ :mz (require (prefix-in vim- 'vimext)) -+ endif -+ endfunction - -+ if has("mzscheme") -+ silent call MzRequire() -+ endif -+< - ============================================================================== - 3. Threads *mzscheme-threads* - - The MzScheme interface supports threads. They are independent from OS threads, - thus scheduling is required. The option 'mzquantum' determines how often -@@ -157,24 +141,24 @@ Vim should poll for available MzScheme t - NOTE - Thread scheduling in the console version of Vim is less reliable than in the - GUI version. - - ============================================================================== --5. VIM Functions *mzscheme-vim* -+4. Vim access from MzScheme *mzscheme-vim* - - *mzscheme-vimext* - The 'vimext' module provides access to procedures defined in the MzScheme - interface. - - Common - ------ - (command {command-string}) Perform the vim ":Ex" style command. -- (eval {expr-string}) Evaluate the vim expression to a string. -- A |List| is turned into a string by -- joining the items and inserting line -- breaks. -- NOTE clashes with MzScheme eval -+ (eval {expr-string}) Evaluate the vim expression into -+ respective MzScheme object: |Lists| are -+ represented as Scheme lists, -+ |Dictionaries| as hash tables. -+ NOTE the name clashes with MzScheme eval - (range-start) Start/End of the range passed with - (range-end) the Scheme command. - (beep) beep - (get-option {option-name} [buffer-or-window]) Get Vim option value (either - local or global, see set-option). -@@ -184,11 +168,10 @@ Common - optname+=optval, etc.) When called with - {buffer} or {window} the local option will - be set. The symbol 'global can be passed - as {buffer-or-window}. Then |:setglobal| - will be used. -- global-namespace The MzScheme main namespace. - - Buffers *mzscheme-buffer* - ------- - (buff? {object}) Is object a buffer? - (buff-valid? {object}) Is object a valid buffer? (i.e. -@@ -226,11 +209,10 @@ Buffers *mzscheme-buffer* - (open-buff {filename}) Open a new buffer (for file "name") - (get-buff-by-name {buffername}) Get a buffer by its filename or #f - if there is no such buffer. - (get-buff-by-num {buffernum}) Get a buffer by its number (return #f if - there is no buffer with this number). -- (get-buff-namespace [buffer]) Get buffer namespace. - - Windows *mzscheme-window* - ------ - (win? {object}) Is object a window? - (win-valid? {object}) Is object a valid window (i.e. corresponds -@@ -248,11 +230,17 @@ Windows *mzscheme-window* - (get-cursor [window]) Get cursor position in a window as - a pair (linenr . column). - (set-cursor (line . col) [window]) Set cursor position. - - ============================================================================== --5. Dynamic loading *mzscheme-dynamic* -+5. mzeval() Vim function *mzscheme-mzeval* -+ -+To facilitate bi-directional interface, you can use |mzeval| function to -+evaluate MzScheme expressions and pass their values to VimL. -+ -+============================================================================== -+6. Dynamic loading *mzscheme-dynamic* *E815* - - On MS-Windows the MzScheme libraries can be loaded dynamically. The |:version| - output then includes |+mzscheme/dyn|. - - This means that Vim will search for the MzScheme DLL files only when needed. ---- vim72.orig/runtime/doc/map.txt -+++ vim72/runtime/doc/map.txt -@@ -222,10 +222,14 @@ define a new mapping or abbreviation, th - expression is evaluated to obtain the {rhs} that is used. Example: > - :inoremap <expr> . InsertDot() - The result of the InsertDot() function will be inserted. It could check the - text before the cursor and start omni completion when some condition is met. - -+For abbreviations |v:char| is set to the character that was typed to trigger -+the abbreviation. You can use this to decide how to expand the {lhs}. You -+can't change v:char and you should not insert it. -+ - Be very careful about side effects! The expression is evaluated while - obtaining characters, you may very well make the command dysfunctional. - For this reason the following is blocked: - - Changing the buffer text |textlock|. - - Editing another buffer. ---- vim72.orig/runtime/doc/netbeans.txt -+++ vim72/runtime/doc/netbeans.txt -@@ -1,6 +1,6 @@ --*netbeans.txt* For Vim version 7.2. Last change: 2008 Jun 28 -+*netbeans.txt* For Vim version 7.2. Last change: 2009 Jan 06 - - - VIM REFERENCE MANUAL by Gordon Prieur et al. - - -@@ -720,12 +720,14 @@ keyCommand keyName - keyAtPos keyName lnum/col - Like "keyCommand" and also report the line number and column - of the cursor. - New in version 2.1. - --killed A file was closed by the user. Only for files that have been -- assigned a number by the IDE. -+killed A file was deleted or wiped out by the user and the buffer -+ annotations have been removed. The bufID number for this -+ buffer has become invalid. Only for files that have been -+ assigned a bufID number by the IDE. - - newDotAndMark off off - Reports the position of the cursor being at "off" bytes into - the buffer. Only sent just before a "keyCommand" event. - ---- vim72.orig/runtime/doc/options.txt -+++ vim72/runtime/doc/options.txt -@@ -1,6 +1,6 @@ --*options.txt* For Vim version 7.2. Last change: 2008 Aug 06 -+*options.txt* For Vim version 7.2. Last change: 2008 Nov 25 - - - VIM REFERENCE MANUAL by Bram Moolenaar - - -@@ -1441,10 +1441,18 @@ A jump table for the options with a shor - Also applies to the modeless selection. - - autoselectml Like "autoselect", but for the modeless selection - only. Compare to the 'A' flag in 'guioptions'. - -+ html When the clipboard contains HTML, use this when -+ pasting. When putting text on the clipboard, mark it -+ as HTML. This works to copy rendered HTML from -+ Firefox, paste it as raw HTML in Vim, select the HTML -+ in Vim and paste it in a rich edit box in Firefox. -+ Only supported for GTK version 2 and later. -+ Only available with the |+multi_byte| feature. -+ - exclude:{pattern} - Defines a pattern that is matched against the name of - the terminal 'term'. If there is a match, no - connection will be made to the X server. This is - useful in this situation: -@@ -4173,13 +4181,10 @@ A jump table for the options with a shor - care of translating these special characters to the original meaning - of the key. This means you don't have to change the keyboard mode to - be able to execute Normal mode commands. - This is the opposite of the 'keymap' option, where characters are - mapped in Insert mode. -- This only works for 8-bit characters. The value of 'langmap' may be -- specified with multi-byte characters (e.g., UTF-8), but only the lower -- 8 bits of each character will be used. - - Example (for Greek, in UTF-8): *greek* > - :set langmap=ΑA,Î’B,ΨC,ΔD,ΕE,ΦF,ΓG,ΗH,ΙI,ΞJ,ΚK,ΛL,ÎœM,ÎN,ΟO,Î P,QQ,ΡR,ΣS,ΤT,ΘU,ΩV,WW,ΧX,Î¥Y,ΖZ,αa,βb,ψc,δd,εe,φf,γg,ηh,ιi,ξj,κk,λl,μm,νn,οo,Ï€p,qq,Ïr,σs,Ï„t,θu,ωv,Ï‚w,χx,Ï…y,ζz - < Example (exchanges meaning of z and y for commands): > - :set langmap=zy,yz,ZY,YZ -@@ -7470,11 +7475,13 @@ A jump table for the options with a shor - global - {not in Vi} - {not available when compiled without the |+wildignore| - feature} - A list of file patterns. A file that matches with one of these -- patterns is ignored when completing file or directory names. -+ patterns is ignored when completing file or directory names, and -+ influences the result of |expand()|, |glob()| and |globpath()| unless -+ a flag is passed to disable this. - The pattern is used like with |:autocmd|, see |autocmd-patterns|. - Also see 'suffixes'. - Example: > - :set wildignore=*.o,*.obj - < The use of |:set+=| and |:set-=| is preferred when adding or removing ---- vim72.orig/runtime/doc/os_vms.txt -+++ vim72/runtime/doc/os_vms.txt -@@ -1,6 +1,6 @@ --*os_vms.txt* For Vim version 7.2. Last change: 2006 Nov 18 -+*os_vms.txt* For Vim version 7.2. Last change: 2008 Aug 19 - - - VIM REFERENCE MANUAL - - -@@ -310,11 +310,11 @@ features, it is worth to choose non GUI - - ============================================================================== - - 8. Useful notes *vms-notes* - --8.1 backspace/delete -+8.1 Backspace/delete - 8.2 Filters - 8.3 VMS file version numbers - 8.4 Directory conversion - 8.5 Remote host invocation - 8.6 Terminal problems -@@ -324,12 +324,14 @@ features, it is worth to choose non GUI - 8.10 Setting up the symbols - 8.11 diff and other GNU programs - 8.12 diff-mode - 8.13 Allow '$' in C keywords - 8.14 VIMTUTOR for beginners -+8.15 Slow start in console mode issue -+8.16 Common VIM directory - different architectures - --8.1 backspace/delete -+8.1 Backspace/delete - - There are backspace/delete key inconsistencies with VMS. - :fixdel doesn't do the trick, but the solution is: > - - :inoremap ^? ^H " for terminal mode -@@ -661,16 +663,134 @@ start it with: > - - @vim:vimtutor - - (Thomas.R.Wyant III, Vim 6.1) - -+8.14 Slow start in console mode issue -+ -+As GUI/GTK Vim works equally well in console mode, many administartors -+deploy those executables system wide. -+Unfortunately, on a remote slow connections GUI/GTK executables behave rather -+slow when user wants to run Vim just in the console mode - because of X environment detection timeout. -+ -+Luckily, there is a simple solution for that. Administrators need to deploy -+both GUI/GTK build and just console build executables, like below: > -+ -+ |- vim72 -+ |----- doc -+ |----- syntax -+ vimrc (system rc files) -+ gvimrc -+ gvim.exe (the remaned GUI or GTK built vim.exe) -+ vim.exe (the console only executable) -+ -+Define system symbols like below in for ex in LOGIN.COM or SYLOGIN.COM: > -+ -+ $ define/nolog VIM RF10:[UTIL.VIM72] ! where you VIM directory is -+ $ vi*m :== mcr VIM:VIM.EXE -+ $ gvi*m :== mcr VIM:GVIM.EXE -+ $ ! or you can try to spawn with -+ $ gv*im :== spawn/nowait/input=NLA0 mcr VIM:GVIM.EXE -g -GEOMETRY 80x40 -+ -+ -+Like this, users that do not have X environment and want to use Vim just in -+console mode can avoid performance problems. -+ -+(Zoltan Arpadffy, Vim 7.2) -+ -+8.15 Common VIM directory - different architectures -+ -+In a cluster that contains nodes with different architectures like below: -+ -+$show cluster -+View of Cluster from system ID 11655 node: TOR 18-AUG-2008 11:58:31 -++---------------------------------+ -+¦ SYSTEMS ¦ MEMBERS ¦ -++-----------------------+---------¦ -+¦ NODE ¦ SOFTWARE ¦ STATUS ¦ -++--------+--------------+---------¦ -+¦ TOR ¦ VMS V7.3-2 ¦ MEMBER ¦ -+¦ TITAN2 ¦ VMS V8.3 ¦ MEMBER ¦ -+¦ ODIN ¦ VMS V7.3-2 ¦ MEMBER ¦ -++---------------------------------+ -+ -+It is convinient to have a common VIM directory but execute different -+executables. -+There are more solutions for this problem: -+ -+solution 1. all executables in the same directory with different names -+This is easily done with the following script that can be added -+to the login.com or sylogin.com: > -+ -+ $ if f$getsyi("NODE_HWTYPE") .eqs. "VAX" -+ $ then -+ $ say "VAX platform" -+ $ vi*m:== mcr vim:VIM.EXE_VAX -+ $ endif -+ $ if f$getsyi("NODE_HWTYPE") .eqs. "ALPH" -+ $ then -+ $ say "ALPHA platform" -+ $ vi*m :== mcr vim:VIM.EXE_AXP -+ $ endif -+ $ if f$getsyi("ARCH_NAME") .eqs. "IA64" -+ $ then -+ $ say "IA64 platform" -+ $ vi*m :== mcr vim:VIM.EXE_IA64 -+ $ endif -+ -+solution 2. different directories: > -+ -+ $ if f$getsyi("NODE_HWTYPE") .eqs. "VAX" -+ $ then -+ $ say "VAX platform" -+ $ define/nolog VIM RF10:[UTIL.VAX_EXE] ! VAX executables -+ $ endif -+ $ if f$getsyi("NODE_HWTYPE") .eqs. "ALPH" -+ $ then -+ $ say "ALPHA platform" -+ $ define/nolog VIM RF10:[UTIL.AXP_EXE] ! AXP executables -+ $ endif -+ $ if f$getsyi("ARCH_NAME") .eqs. "IA64" -+ $ then -+ $ say "IA64 platform" -+ $ define/nolog VIM RF10:[UTIL.IA64_EXE] ! IA64 executables -+ $ endif -+ $! VIMRUNTIME must be defined in order to find runtime files -+ $ define/nolog VIMRUNTIME RF10:[UTIL.VIM72] -+ -+A good examle for this approach is the [GNU]gnu_tools.com script from GNU_TOOLS.ZIP -+package downloadable from http://www.polarhome.com/vim/ -+ -+(Zoltan Arpadffy, Vim 7.2) -+ - ============================================================================== - - 9. VMS related changes *vms-changes* - --Version 7 -+Recent changes -+- The following plugins are included into VMS runtime: -+ genutils 2.4, multiselect 2.2, multvals 3.1, selectbuf 4.3, -+ bufexplorer 7.1.7, taglist 4.5 -+- minor changes in vimrc (just in VMS runtime) -+- make_vms.mms - HUGE model is the default -+- [TESTDIR]make_vms.mms include as many tests possible -+- modify test30 and test54 for VMS -+- enable FLOAT feature in VMS port -+- os_vms.txt updated -+ -+Version 7.2 (2008 Aug 9) -+- VCF files write corrected -+- CTAGS 5.7 included -+- corrected make_vms.mms (on VAX gave syntax error) -+ -+Version 7.1 (2007 Jun 15) -+- create TAGS file from menu -+ -+Version 7 (2006 May 8) - - Improved low level char input (affects just console mode) -+- Fixed plugin bug -+- CTAGS 5.6 included - - Version 6.4 (2005 Oct 15) - - GTKLIB and Vim build on IA64 - - colors in terminal mode - - syntax highlighting in terminal mode -@@ -804,10 +924,11 @@ Version 4.5 (1996 Dec 16) - - 10. Authors *vms-authors* - - OpenVMS documentation and executables are maintained by: - Zoltan Arpadffy <arpadffy@polarhome.com> -+OpenVMS Vim page: http://www.polarhome.com/vim/ - - This document uses parts and remarks from earlier authors and contributors - of OS_VMS.TXT: - Charles E. Campbell, Jr. <cec@gryphon.gsfc.nasa.gov> - Bruce Hunsaker <BNHunsaker@chq.byu.edu> ---- vim72.orig/runtime/doc/spell.txt -+++ vim72/runtime/doc/spell.txt -@@ -1,6 +1,6 @@ --*spell.txt* For Vim version 7.2. Last change: 2008 Jun 21 -+*spell.txt* For Vim version 7.2. Last change: 2008 Nov 30 - - - VIM REFERENCE MANUAL by Bram Moolenaar - - -@@ -829,12 +829,15 @@ AFFIX FILE FORMAT *spell-aff-format* * - *spell-affix-comment* - Comment lines in the .aff file start with a '#': - - # comment line ~ - --With some items it's also possible to put a comment after it, but this isn't --supported in general. -+Items with a fixed number of arguments can be followed by a comment. But only -+if none of the arguments can contain white space. The comment must start with -+a "#" character. Example: -+ -+ KEEPCASE = # fix case for words with this flag ~ - - - ENCODING *spell-SET* - - The affix file can be in any encoding that is supported by "iconv". However, -@@ -963,10 +966,13 @@ When using "caplong" the two-character f - "B1", "BB", etc. This is useful to use one-character flags for the most - common items and two-character flags for uncommon items. - - Note: When using utf-8 only characters up to 65000 may be used for flags. - -+Note: even when using "num" or "long" the number of flags available to -+compounding and prefixes is limited to about 250. -+ - - AFFIXES - *spell-PFX* *spell-SFX* - The usual PFX (prefix) and SFX (suffix) lines are supported (see the Myspell - documentation or the Aspell manual: -@@ -1176,10 +1182,13 @@ Once a word has been marked as bad it wo - word as good. - - The flag also applies to the word with affixes, thus this can be used to mark - a whole bunch of related words as bad. - -+ *spell-FORBIDDENWORD* -+FORBIDDENWORD can be used just like BAD. For compatibility with Hunspell. -+ - *spell-NEEDAFFIX* - The NEEDAFFIX flag is used to require that a word is used with an affix. The - word itself is not a good word (unless there is an empty affix). Example: - - NEEDAFFIX + ~ -@@ -1266,10 +1275,14 @@ on the inside of a compound word. This - The NEEDCOMPOUND flag is used to require that a word is used as part of a - compound word. The word itself is not a good word. Example: - - NEEDCOMPOUND & ~ - -+ *spell-ONLYINCOMPOUND* -+The ONLYINCOMPOUND does exactly the same as NEEDCOMPOUND. Supported for -+compatiblity with Hunspell. -+ - *spell-COMPOUNDMIN* - The minimal character length of a word used for compounding is specified with - COMPOUNDMIN. Example: - COMPOUNDMIN 5 ~ - -@@ -1326,10 +1339,24 @@ Note: this doesn't work for postponed pr - The COMPOUNDROOT flag is used for words in the dictionary that are already a - compound. This means it counts for two words when checking the compounding - rules. Can also be used for an affix to count the affix as a compounding - word. - -+ *spell-CHECKCOMPOUNDPATTERN* -+CHECKCOMPOUNDPATTERN is used to define patterns that, when matching at the -+position where two words are compounded together forbids the compound. -+For example: -+ CHECKCOMPOUNDPATTERN o e ~ -+ -+This forbids compounding if the first word ends in "o" and the second word -+starts with "e". -+ -+The arguments must be plain text, no patterns are actually supported, despite -+the item name. Case is always ignored. -+ -+The Hunspell feature to use three arguments and flags is not supported. -+ - *spell-SYLLABLE* - The SYLLABLE item defines characters or character sequences that are used to - count the number of syllables in a word. Example: - SYLLABLE aáeéiíoóöõuúüûy/aa/au/ea/ee/ei/ie/oa/oe/oo/ou/uu/ui ~ - -@@ -1494,10 +1521,14 @@ These items appear in the affix file of - ignored, not supported or defined in another way. - - ACCENT (Hunspell) *spell-ACCENT* - Use MAP instead. |spell-MAP| - -+BREAK (Hunspell) *spell-BREAK* -+ Define break points. Unclear how it works exactly. -+ Not supported. -+ - CHECKCOMPOUNDCASE (Hunspell) *spell-CHECKCOMPOUNDCASE* - Disallow uppercase letters at compound word boundaries. - Not supported. - - CHECKCOMPOUNDDUP (Hunspell) *spell-CHECKCOMPOUNDDUP* -@@ -1510,13 +1541,10 @@ CHECKCOMPOUNDREP (Hunspell) *spell-CH - - CHECKCOMPOUNDTRIPLE (Hunspell) *spell-CHECKCOMPOUNDTRIPLE* - Forbid three identical characters when compounding. Not - supported. - --CHECKCOMPOUNDPATTERN (Hunspell) *spell-CHECKCOMPOUNDPATTERN* -- Forbid compounding when patterns match. Not supported. -- - COMPLEXPREFIXES (Hunspell) *spell-COMPLEXPREFIXES* - Enables using two prefixes. Not supported. - - COMPOUND (Hunspell) *spell-COMPOUND* - This is one line with the count of COMPOUND items, followed by -@@ -1534,16 +1562,21 @@ COMPOUNDEND (Hunspell) *spell-COMPOUN - Use COMPOUNDRULE instead. |spell-COMPOUNDRULE| - - COMPOUNDMIDDLE (Hunspell) *spell-COMPOUNDMIDDLE* - Use COMPOUNDRULE instead. |spell-COMPOUNDRULE| - -+COMPOUNDRULES (Hunspell) *spell-COMPOUNDRULES* -+ Number of COMPOUNDRULE lines following. Ignored, but the -+ argument must be a number. -+ - COMPOUNDSYLLABLE (Hunspell) *spell-COMPOUNDSYLLABLE* - Use SYLLABLE and COMPOUNDSYLMAX instead. |spell-SYLLABLE| - |spell-COMPOUNDSYLMAX| - --FORBIDDENWORD (Hunspell) *spell-FORBIDDENWORD* -- Use BAD instead. |spell-BAD| -+KEY (Hunspell) *spell-KEY* -+ Define characters that are close together on the keyboard. -+ Used to give better suggestions. Not supported. - - LANG (Hunspell) *spell-LANG* - This specifies language-specific behavior. This actually - moves part of the language knowledge into the program, - therefore Vim does not support it. Each language property -@@ -1551,14 +1584,11 @@ LANG (Hunspell) *spell-LANG* - - LEMMA_PRESENT (Hunspell) *spell-LEMMA_PRESENT* - Only needed for morphological analysis. - - MAXNGRAMSUGS (Hunspell) *spell-MAXNGRAMSUGS* -- Not supported. -- --ONLYINCOMPOUND (Hunspell) *spell-ONLYINCOMPOUND* -- Use NEEDCOMPOUND instead. |spell-NEEDCOMPOUND| -+ Set number of n-gram suggestions. Not supported. - - PSEUDOROOT (Hunspell) *spell-PSEUDOROOT* - Use NEEDAFFIX instead. |spell-NEEDAFFIX| - - SUGSWITHDOTS (Hunspell) *spell-SUGSWITHDOTS* ---- vim72.orig/runtime/doc/starting.txt -+++ vim72/runtime/doc/starting.txt -@@ -1,6 +1,6 @@ --*starting.txt* For Vim version 7.2. Last change: 2008 Jun 21 -+*starting.txt* For Vim version 7.2. Last change: 2008 Nov 09 - - - VIM REFERENCE MANUAL by Bram Moolenaar - - -@@ -142,10 +142,18 @@ a slash. Thus "-R" means recovery and " - (nothing) yes yes - -u NONE no no - -u NORC no yes - --noplugin yes no - -+--startuptime {fname} *--startuptime* -+ During startup write timing messages to the file {fname}. -+ This can be used to find out where time is spent while loading -+ your .vimrc, plugins and opening the first file. -+ When {fname} already exists new messages are appended. -+ (Only available when compiled with the |+startuptime| -+ feature). -+ - *--literal* - --literal Take file names literally, don't expand wildcards. Not needed - for Unix, because Vim always takes file names literally (the - shell expands wildcards). - Applies to all the names, also the ones that come before this -@@ -469,10 +477,11 @@ a slash. Thus "-R" means recovery and " - *-X* - -X Do not try connecting to the X server to get the current - window title and copy/paste using the X clipboard. This - avoids a long startup time when running Vim in a terminal - emulator and the connection to the X server is slow. -+ See |--startuptime| to find out if affects you. - Only makes a difference on Unix or VMS, when compiled with the - |+X11| feature. Otherwise it's ignored. - To disable the connection only for specific terminals, see the - 'clipboard' option. - When the X11 Session Management Protocol (XSMP) handler has -@@ -1335,12 +1344,13 @@ working on. Viminfo and Session files t - enter Vim and directly start working in your desired setup. |session-file| - - *viminfo-read* - When Vim is started and the 'viminfo' option is non-empty, the contents of - the viminfo file are read and the info can be used in the appropriate places. --The marks are not read in at startup (but file marks are). See --|initialization| for how to set the 'viminfo' option upon startup. -+The |v:oldfiles| variable is filled. The marks are not read in at startup -+(but file marks are). See |initialization| for how to set the 'viminfo' -+option upon startup. - - *viminfo-write* - When Vim exits and 'viminfo' is non-empty, the info is stored in the viminfo - file (it's actually merged with the existing one, if one exists). The - 'viminfo' option is a string containing information about what info should be -@@ -1370,10 +1380,12 @@ about to abandon with ":bdel", use ":wv" - stored, but the '"' mark is. The '"' mark is very useful for jumping to the - cursor position when the file was last exited. No marks are saved for files - that start with any string given with the "r" flag in 'viminfo'. This can be - used to avoid saving marks for files on removable media (for MS-DOS you would - use "ra:,rb:", for Amiga "rdf0:,rdf1:,rdf2:"). -+The |v:oldfiles| variable is filled with the file names that the viminfo file -+has marks for. - - *viminfo-file-marks* - Uppercase marks ('A to 'Z) are stored when writing the viminfo file. The - numbered marks ('0 to '9) are a bit special. When the viminfo file is written - (when exiting or with the ":wviminfo" command), '0 is set to the current cursor -@@ -1461,12 +1473,12 @@ either have to fix the error, or delete - most of the information will be restored). - - *:rv* *:rviminfo* *E195* - :rv[iminfo][!] [file] Read from viminfo file [file] (default: see above). - If [!] is given, then any information that is -- already set (registers, marks, etc.) will be -- overwritten. {not in Vi} -+ already set (registers, marks, |v:oldfiles|, etc.) -+ will be overwritten {not in Vi} - - *:wv* *:wviminfo* *E137* *E138* *E574* - :wv[iminfo][!] [file] Write to viminfo file [file] (default: see above). - The information in the file is first read in to make - a merge between old and new info. When [!] is used, -@@ -1477,6 +1489,22 @@ most of the information will be restored - check that no old temp files were left behind (e.g. - ~/.viminf*) and that you can write in the directory of - the .viminfo file. - {not in Vi} - -+ *:ol* *:oldfiles* -+:ol[dfiles] List the files that have marks stored in the viminfo -+ file. This list is read on startup and only changes -+ afterwards with ":rviminfo!". Also see |v:oldfiles|. -+ The number can be used with |c_#<|. -+ {not in Vi, only when compiled with the +eval feature} -+ -+:bro[wse] ol[dfiles][!] -+ List file names as with |:oldfiles|, and then prompt -+ for a number. When the number is valid that file from -+ the list is edited. -+ If you get the |press-enter| prompt you can press "q" -+ and still get the prompt to enter a file number. -+ Use ! to abondon a modified buffer. |abandon| -+ {not when compiled with tiny or small features} -+ - vim:tw=78:ts=8:ft=help:norl: ---- vim72.orig/runtime/doc/usr_21.txt -+++ vim72/runtime/doc/usr_21.txt -@@ -1,6 +1,6 @@ --*usr_21.txt* For Vim version 7.2. Last change: 2007 May 01 -+*usr_21.txt* For Vim version 7.2. Last change: 2008 Nov 09 - - VIM USER MANUAL - by Bram Moolenaar - - Go away and come back - -@@ -151,11 +151,11 @@ See the 'viminfo' option and |viminfo-fi - When you run Vim multiple times, the last one exiting will store its - information. This may cause information that previously exiting Vims stored - to be lost. Each item can be remembered only once. - - --GETTING BACK TO WHERE YOU WERE -+GETTING BACK TO WHERE YOU STOPPED VIM - - You are halfway editing a file and it's time to leave for holidays. You exit - Vim and go enjoy yourselves, forgetting all about your work. After a couple - of weeks you start Vim, and type: - > -@@ -166,10 +166,52 @@ And you are right back where you left Vi - position that '0 pointed to is made '1. And '1 is made to '2, and so forth. - Mark '9 is lost. - The |:marks| command is useful to find out where '0 to '9 will take you. - - -+GETTING BACK TO SOME FILE -+ -+If you want to go back to a file that you edited recently, but not when -+exiting Vim, there is a slightly more complicated way. You can see a list of -+files by typing the command: > -+ -+ :oldfiles -+< 1: ~/.viminfo ~ -+ 2: ~/text/resume.txt ~ -+ 3: /tmp/draft ~ -+ -+Now you would like to edit the second file, which is in the list preceded by -+"2:". You type: > -+ -+ :e #<2 -+ -+Instead of ":e" you can use any command that has a file name argument, the -+"#<2" item works in the same place as "%" (current file name) and "#" -+(alternate file name). So you can also split the window to edit the third -+file: > -+ -+ :split #<3 -+ -+That #<123 thing is a bit complicated when you just want to edit a file. -+Fortunately there is a simpler way: > -+ -+ :browse oldfiles -+< 1: ~/.viminfo ~ -+ 2: ~/text/resume.txt ~ -+ 3: /tmp/draft ~ -+ -- More -- -+ -+You get the same list of files as with |:oldfiles|. If you want to edit -+"resume.txt" first press "q" to stop the listing. You will get a prompt: -+ -+ Type number and <Enter> (empty cancels): ~ -+ -+Type "2" and press <Enter> to edit the second file. -+ -+More info at |:oldfiles|, |v:oldfiles| and |c_#<|. -+ -+ - MOVE INFO FROM ONE VIM TO ANOTHER - - You can use the ":wviminfo" and ":rviminfo" commands to save and restore the - information while still running Vim. This is useful for exchanging register - contents between two instances of Vim, for example. In the first Vim do: > ---- vim72.orig/runtime/doc/usr_41.txt -+++ vim72/runtime/doc/usr_41.txt -@@ -866,10 +866,12 @@ Various: - setreg() set contents and type of a register - - taglist() get list of matching tags - tagfiles() get a list of tags files - -+ mzeval() evaluate |MzScheme| expression -+ - ============================================================================== - *41.7* Defining a function - - Vim enables you to define your own functions. The basic function declaration - begins as follows: > ---- vim72.orig/runtime/doc/various.txt -+++ vim72/runtime/doc/various.txt -@@ -372,10 +372,11 @@ m *+ruby* Ruby interface |ruby| - m *+ruby/dyn* Ruby interface |ruby-dynamic| |/dyn| - N *+scrollbind* |'scrollbind'| - B *+signs* |:sign| - N *+smartindent* |'smartindent'| - m *+sniff* SniFF interface |sniff| -+N *+startuptime* |--startuptime| argument - N *+statusline* Options 'statusline', 'rulerformat' and special - formats of 'titlestring' and 'iconstring' - m *+sun_workshop* |workshop| - N *+syntax* Syntax highlighting |syntax| - *+system()* Unix only: opposite of |+fork| -@@ -506,10 +507,21 @@ N *+X11* Unix only: can restore window - ":silent menu ..." defines a menu that will not echo a - Command-line command. The command will still produce - messages though. Use ":silent" in the command itself - to avoid that: ":silent menu .... :silent command". - -+ *:uns* *:unsilent* -+:uns[ilent] {command} Execute {command} not silently. Only makes a -+ difference when |:silent| was used to get to this -+ command. -+ Use this for giving a message even when |:silent| was -+ used. In this example |:silent| is used to avoid the -+ message about reading the file and |:unsilent| to be -+ able to list the first line of each file. > -+ :silent argdo unsilent echo expand('%') . ": " . getline(1) -+< -+ - *:verb* *:verbose* - :[count]verb[ose] {command} - Execute {command} with 'verbose' set to [count]. If - [count] is omitted one is used. ":0verbose" can be - used to set 'verbose' to zero. ---- vim72.orig/runtime/filetype.vim -+++ vim72/runtime/filetype.vim -@@ -2398,22 +2398,24 @@ au BufNewFile,BufRead /etc/xinetd.d/* c - - " Z-Shell script - au BufNewFile,BufRead zsh*,zlog* call s:StarSetf('zsh') - - -+ -+" Use the filetype detect plugins. They may overrule any of the previously -+" detected filetypes. -+runtime! ftdetect/*.vim -+ -+ - " Generic configuration file (check this last, it's just guessing!) - au BufNewFile,BufRead,StdinReadPost * - \ if !did_filetype() && expand("<amatch>") !~ g:ft_ignore_pat - \ && (getline(1) =~ '^#' || getline(2) =~ '^#' || getline(3) =~ '^#' - \ || getline(4) =~ '^#' || getline(5) =~ '^#') | - \ setf conf | - \ endif - --" Use the plugin-filetype checks last, they may overrule any of the previously --" detected filetypes. --runtime! ftdetect/*.vim -- - augroup END - - - " If the GUI is already running, may still need to install the Syntax menu. - " Don't do it when the 'M' flag is included in 'guioptions'. ---- vim72.orig/runtime/plugin/gzip.vim -+++ vim72/runtime/plugin/gzip.vim -@@ -1,8 +1,8 @@ - " Vim plugin for editing compressed files. - " Maintainer: Bram Moolenaar <Bram@vim.org> --" Last Change: 2005 Jul 26 -+" Last Change: 2010 Mar 10 - - " Exit quickly when: - " - this plugin was already loaded - " - when 'compatible' is set - " - some autocommands are already taking care of compressed files -@@ -18,19 +18,27 @@ augroup gzip - " Enable editing of gzipped files. - " The functions are defined in autoload/gzip.vim. - " - " Set binary mode before reading the file. - " Use "gzip -d", gunzip isn't always available. -- autocmd BufReadPre,FileReadPre *.gz,*.bz2,*.Z setlocal bin -+ autocmd BufReadPre,FileReadPre *.gz,*.bz2,*.Z,*.lzma,*.xz setlocal bin - autocmd BufReadPost,FileReadPost *.gz call gzip#read("gzip -dn") - autocmd BufReadPost,FileReadPost *.bz2 call gzip#read("bzip2 -d") - autocmd BufReadPost,FileReadPost *.Z call gzip#read("uncompress") -+ autocmd BufReadPost,FileReadPost *.lzma call gzip#read("lzma -d") -+ autocmd BufReadPost,FileReadPost *.xz call gzip#read("xz -d") - autocmd BufWritePost,FileWritePost *.gz call gzip#write("gzip") - autocmd BufWritePost,FileWritePost *.bz2 call gzip#write("bzip2") - autocmd BufWritePost,FileWritePost *.Z call gzip#write("compress -f") -+ autocmd BufWritePost,FileWritePost *.lzma call gzip#write("lzma -z") -+ autocmd BufWritePost,FileWritePost *.xz call gzip#write("xz -z") - autocmd FileAppendPre *.gz call gzip#appre("gzip -dn") - autocmd FileAppendPre *.bz2 call gzip#appre("bzip2 -d") - autocmd FileAppendPre *.Z call gzip#appre("uncompress") -+ autocmd FileAppendPre *.lzma call gzip#appre("lzma -d") -+ autocmd FileAppendPre *.xz call gzip#appre("xz -d") - autocmd FileAppendPost *.gz call gzip#write("gzip") - autocmd FileAppendPost *.bz2 call gzip#write("bzip2") - autocmd FileAppendPost *.Z call gzip#write("compress -f") -+ autocmd FileAppendPost *.lzma call gzip#write("lzma -z") -+ autocmd FileAppendPost *.xz call gzip#write("xz -z") - augroup END ---- vim72.orig/runtime/scripts.vim -+++ vim72/runtime/scripts.vim -@@ -232,10 +232,14 @@ else - - " XHTML (e.g.: PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN") - elseif s:line1 =~ '\<DTD\s\+XHTML\s' - set ft=xhtml - -+ " HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN") -+ elseif s:line1 =~? '\<DOCTYPE\s\+html\>' -+ set ft=html -+ - " PDF - elseif s:line1 =~ '^%PDF-' - set ft=pdf - - " XXD output ---- vim72.orig/runtime/tools/README.txt -+++ vim72/runtime/tools/README.txt -@@ -30,6 +30,8 @@ vim_vs_net.cmd: MS-Windows command file - later. - - xcmdsrv_client.c: Example for a client program that communicates with a Vim - server through the X-Windows interface. - -+unicode.vim Vim script to generate tables for src/mbyte.c. -+ - [xxd (and tee for OS/2) can be found in the src directory] ---- /dev/null -+++ vim72/runtime/tools/unicode.vim -@@ -0,0 +1,290 @@ -+" Script to extract tables from Unicode .txt files, to be used in src/mbyte.c. -+" The format of the UnicodeData.txt file is explained here: -+" http://www.unicode.org/Public/5.1.0/ucd/UCD.html -+" For the other files see the header. -+" -+" Usage: Vim -S <this-file> -+" -+" Author: Bram Moolenaar -+" Last Update: 2010 Jan 12 -+ -+" Parse lines of UnicodeData.txt. Creates a list of lists in s:dataprops. -+func! ParseDataToProps() -+ let s:dataprops = [] -+ let lnum = 1 -+ while lnum <= line('$') -+ let l = split(getline(lnum), '\s*;\s*', 1) -+ if len(l) != 15 -+ echoerr 'Found ' . len(l) . ' items in line ' . lnum . ', expected 15' -+ return -+ endif -+ call add(s:dataprops, l) -+ let lnum += 1 -+ endwhile -+endfunc -+ -+" Parse lines of CaseFolding.txt. Creates a list of lists in s:foldprops. -+func! ParseFoldProps() -+ let s:foldprops = [] -+ let lnum = 1 -+ while lnum <= line('$') -+ let line = getline(lnum) -+ if line !~ '^#' && line !~ '^\s*$' -+ let l = split(line, '\s*;\s*', 1) -+ if len(l) != 4 -+ echoerr 'Found ' . len(l) . ' items in line ' . lnum . ', expected 4' -+ return -+ endif -+ call add(s:foldprops, l) -+ endif -+ let lnum += 1 -+ endwhile -+endfunc -+ -+" Parse lines of EastAsianWidth.txt. Creates a list of lists in s:widthprops. -+func! ParseWidthProps() -+ let s:widthprops = [] -+ let lnum = 1 -+ while lnum <= line('$') -+ let line = getline(lnum) -+ if line !~ '^#' && line !~ '^\s*$' -+ let l = split(line, '\s*;\s*', 1) -+ if len(l) != 2 -+ echoerr 'Found ' . len(l) . ' items in line ' . lnum . ', expected 2' -+ return -+ endif -+ call add(s:widthprops, l) -+ endif -+ let lnum += 1 -+ endwhile -+endfunc -+ -+" Build the toLower or toUpper table in a new buffer. -+" Uses s:dataprops. -+func! BuildCaseTable(name, index) -+ let start = -1 -+ let end = -1 -+ let step = 0 -+ let add = -1 -+ let ranges = [] -+ for p in s:dataprops -+ if p[a:index] != '' -+ let n = ('0x' . p[0]) + 0 -+ let nl = ('0x' . p[a:index]) + 0 -+ if start >= 0 && add == nl - n && (step == 0 || n - end == step) -+ " continue with same range. -+ let step = n - end -+ let end = n -+ else -+ if start >= 0 -+ " produce previous range -+ call Range(ranges, start, end, step, add) -+ endif -+ let start = n -+ let end = n -+ let step = 0 -+ let add = nl - n -+ endif -+ endif -+ endfor -+ if start >= 0 -+ call Range(ranges, start, end, step, add) -+ endif -+ -+ " New buffer to put the result in. -+ new -+ exe "file to" . a:name -+ call setline(1, "static convertStruct to" . a:name . "[] =") -+ call setline(2, "{") -+ call append('$', ranges) -+ call setline('$', getline('$')[:-2]) " remove last comma -+ call setline(line('$') + 1, "};") -+ wincmd p -+endfunc -+ -+" Build the foldCase table in a new buffer. -+" Uses s:foldprops. -+func! BuildFoldTable() -+ let start = -1 -+ let end = -1 -+ let step = 0 -+ let add = -1 -+ let ranges = [] -+ for p in s:foldprops -+ if p[1] == 'C' || p[1] == 'S' -+ let n = ('0x' . p[0]) + 0 -+ let nl = ('0x' . p[2]) + 0 -+ if start >= 0 && add == nl - n && (step == 0 || n - end == step) -+ " continue with same range. -+ let step = n - end -+ let end = n -+ else -+ if start >= 0 -+ " produce previous range -+ call Range(ranges, start, end, step, add) -+ endif -+ let start = n -+ let end = n -+ let step = 0 -+ let add = nl - n -+ endif -+ endif -+ endfor -+ if start >= 0 -+ call Range(ranges, start, end, step, add) -+ endif -+ -+ " New buffer to put the result in. -+ new -+ file foldCase -+ call setline(1, "static convertStruct foldCase[] =") -+ call setline(2, "{") -+ call append('$', ranges) -+ call setline('$', getline('$')[:-2]) " remove last comma -+ call setline(line('$') + 1, "};") -+ wincmd p -+endfunc -+ -+func! Range(ranges, start, end, step, add) -+ let s = printf("\t{0x%x,0x%x,%d,%d},", a:start, a:end, a:step == 0 ? -1 : a:step, a:add) -+ call add(a:ranges, s) -+endfunc -+ -+" Build the combining table. -+" Uses s:dataprops. -+func! BuildCombiningTable() -+ let start = -1 -+ let end = -1 -+ let ranges = [] -+ for p in s:dataprops -+ if p[2] == 'Mn' || p[2] == 'Mc' || p[2] == 'Me' -+ let n = ('0x' . p[0]) + 0 -+ if start >= 0 && end + 1 == n -+ " continue with same range. -+ let end = n -+ else -+ if start >= 0 -+ " produce previous range -+ call add(ranges, printf("\t{0x%04x, 0x%04x},", start, end)) -+ endif -+ let start = n -+ let end = n -+ endif -+ endif -+ endfor -+ if start >= 0 -+ call add(ranges, printf("\t{0x%04x, 0x%04x},", start, end)) -+ endif -+ -+ " New buffer to put the result in. -+ new -+ file combining -+ call setline(1, " static struct interval combining[] =") -+ call setline(2, " {") -+ call append('$', ranges) -+ call setline('$', getline('$')[:-2]) " remove last comma -+ call setline(line('$') + 1, " };") -+ wincmd p -+endfunc -+ -+" Build the double width or ambiguous width table in a new buffer. -+" Uses s:widthprops and s:dataprops. -+func! BuildWidthTable(pattern, tableName) -+ let start = -1 -+ let end = -1 -+ let ranges = [] -+ let dataidx = 0 -+ for p in s:widthprops -+ if p[1][0] =~ a:pattern -+ if p[0] =~ '\.\.' -+ " It is a range. we don't check for composing char then. -+ let rng = split(p[0], '\.\.') -+ if len(rng) != 2 -+ echoerr "Cannot parse range: '" . p[0] . "' in width table" -+ endif -+ let n = ('0x' . rng[0]) + 0 -+ let n_last = ('0x' . rng[1]) + 0 -+ else -+ let n = ('0x' . p[0]) + 0 -+ let n_last = n -+ endif -+ " Find this char in the data table. -+ while 1 -+ let dn = ('0x' . s:dataprops[dataidx][0]) + 0 -+ if dn >= n -+ break -+ endif -+ let dataidx += 1 -+ endwhile -+ if dn != n && n_last == n -+ echoerr "Cannot find character " . n . " in data table" -+ endif -+ " Only use the char when it's not a composing char. -+ " But use all chars from a range. -+ let dp = s:dataprops[dataidx] -+ if n_last > n || (dp[2] != 'Mn' && dp[2] != 'Mc' && dp[2] != 'Me') -+ if start >= 0 && end + 1 == n -+ " continue with same range. -+ else -+ if start >= 0 -+ " produce previous range -+ call add(ranges, printf("\t{0x%04x, 0x%04x},", start, end)) -+ endif -+ let start = n -+ endif -+ let end = n_last -+ endif -+ endif -+ endfor -+ if start >= 0 -+ call add(ranges, printf("\t{0x%04x, 0x%04x},", start, end)) -+ endif -+ -+ " New buffer to put the result in. -+ new -+ exe "file " . a:tableName -+ call setline(1, " static struct interval " . a:tableName . "[] =") -+ call setline(2, " {") -+ call append('$', ranges) -+ call setline('$', getline('$')[:-2]) " remove last comma -+ call setline(line('$') + 1, " };") -+ wincmd p -+endfunc -+ -+ -+ -+" Edit the Unicode text file. Requires the netrw plugin. -+edit http://unicode.org/Public/UNIDATA/UnicodeData.txt -+ -+" Parse each line, create a list of lists. -+call ParseDataToProps() -+ -+" Build the toLower table. -+call BuildCaseTable("Lower", 13) -+ -+" Build the toUpper table. -+call BuildCaseTable("Upper", 12) -+ -+" Build the ranges of composing chars. -+call BuildCombiningTable() -+ -+" Edit the case folding text file. Requires the netrw plugin. -+edit http://www.unicode.org/Public/UNIDATA/CaseFolding.txt -+ -+" Parse each line, create a list of lists. -+call ParseFoldProps() -+ -+" Build the foldCase table. -+call BuildFoldTable() -+ -+" Edit the width text file. Requires the netrw plugin. -+edit http://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt -+ -+" Parse each line, create a list of lists. -+call ParseWidthProps() -+ -+" Build the double width table. -+call BuildWidthTable('[WF]', 'doublewidth') -+ -+" Build the ambiguous width table. -+call BuildWidthTable('A', 'ambiguous') ---- vim72.orig/src/GvimExt/Make_ming.mak -+++ vim72/src/GvimExt/Make_ming.mak -@@ -18,28 +18,24 @@ CROSS = no - MINGWOLD = no - - ifeq ($(CROSS),yes) - DEL = rm - ifeq ($(MINGWOLD),yes) --CXX = i586-mingw32msvc-g++ - CXXFLAGS := -O2 -mno-cygwin -fvtable-thunks --WINDRES = i586-mingw32msvc-windres - else --CXX = i386-mingw32msvc-g++ - CXXFLAGS := -O2 -mno-cygwin --WINDRES = i386-mingw32msvc-windres - endif - else --CXX := g++ --WINDRES := windres - CXXFLAGS := -O2 -mno-cygwin - ifneq (sh.exe, $(SHELL)) - DEL = rm - else - DEL = del - endif - endif -+CXX := $(CROSS_COMPILE)g++ -+WINDRES := $(CROSS_COMPILE)windres - LIBS := -luuid - RES := gvimext.res - DEFFILE = gvimext_ming.def - OBJ := gvimext.o - ---- vim72.orig/src/GvimExt/gvimext.cpp -+++ vim72/src/GvimExt/gvimext.cpp -@@ -633,11 +633,13 @@ STDMETHODIMP CShellExt::QueryContextMenu - --pos; - *pos = 0; - } - // Now concatenate - strncpy(temp, _("Edit with existing Vim - "), BUFSIZE - 1); -- strncat(temp, title, BUFSIZE - 1); -+ temp[BUFSIZE - 1] = '\0'; -+ strncat(temp, title, BUFSIZE - 1 - strlen(temp)); -+ temp[BUFSIZE - 1] = '\0'; - InsertMenu(hMenu, - indexMenu++, - MF_STRING|MF_BYPOSITION, - idCmd++, - temp); ---- vim72.orig/src/GvimExt/gvimext.h -+++ vim72/src/GvimExt/gvimext.h -@@ -12,13 +12,13 @@ - */ - - #if !defined(AFX_STDAFX_H__3389658B_AD83_11D3_9C1E_0090278BBD99__INCLUDED_) - #define AFX_STDAFX_H__3389658B_AD83_11D3_9C1E_0090278BBD99__INCLUDED_ - --#if _MSC_VER > 1000 -+#if defined(_MSC_VER) && _MSC_VER > 1000 - #pragma once --#endif // _MSC_VER > 1000 -+#endif - - // Insert your headers here - // #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers - - //-------------------------------------------------------------- -@@ -32,21 +32,21 @@ - #endif - - #define INC_OLE2 // WIN32, get ole2 from windows.h - - /* Visual Studio 2005 has 'deprecated' many of the standard CRT functions */ --#if _MSC_VER >= 1400 -+#if defined(_MSC_VER) && _MSC_VER >= 1400 - # define _CRT_SECURE_NO_DEPRECATE - # define _CRT_NONSTDC_NO_DEPRECATE - #endif - - #include <windows.h> - #include <windowsx.h> - #include <shlobj.h> - - /* Accommodate old versions of VC that don't have a modern Platform SDK */ --#if _MSC_VER < 1300 -+#if defined(_MSC_VER) && _MSC_VER < 1300 - # undef UINT_PTR - # define UINT_PTR UINT - #endif - - #define ResultFromShort(i) ResultFromScode(MAKE_SCODE(SEVERITY_SUCCESS, 0, (USHORT)(i))) ---- vim72.orig/src/INSTALLpc.txt -+++ vim72/src/INSTALLpc.txt -@@ -213,12 +213,13 @@ and you type: - After churning for a while, you will end up with 'gvim.exe' in the 'vim\src' - directory. - - You should not need to do *any* editing of any files to get vim compiled this - way. If, for some reason, you want the console-mode-only version of vim (this --is NOT recommended on Win32, especially on '95/'98!!!), you need only change --the 'gvim.exe' to 'vim.exe' in the 'make' commands given above. -+is NOT recommended on Win32, especially on '95/'98!!!), you can use: -+ -+ make -f Make_ming.mak GUI=no vim.exe - - If you are dismayed by how big the EXE is, I strongly recommend you get 'UPX' - (also free!) and compress the file (typical compression is 50%). UPX can be - found at - http://www.upx.org/ -@@ -238,11 +239,11 @@ Use Make_cyg.mak with Cygwin's GCC. See - http://users.skynet.be/antoine.mechelynck/vim/compile.htm - - The Cygnus one many not fully work yet. - With Cygnus gcc you can use the Unix Makefile instead (you need to get the - Unix archive then). Then you get a Cygwin application (feels like Vim is --runnin on Unix), while with Make_cyg.mak you get a Windows application (like -+running on Unix), while with Make_cyg.mak you get a Windows application (like - with the other makefiles). - - - 4. Borland - =========== -@@ -257,14 +258,17 @@ Use Make_bc5.mak with Borland C++ 5.x. S - [Update of 1) needs to be verified] - - If you like, you can compile the 'mingw' Win32 version from the comfort of - your Linux (or other unix) box. To do this, you need to follow a few steps: - 1) Install the mingw32 cross-compiler. See -+ http://www.mingw.org/wiki/LinuxCrossMinGW - http://www.libsdl.org/extras/win32/cross/README.txt - 2) Get and unpack both the Unix sources and the extra archive - 3) in 'Make_ming.mak', set 'CROSS' to 'yes' instead of 'no'. - Make further changes to 'Make_ming.mak' as you wish. -+ If your cross-compiler prefix differs from the predefined value, -+ set 'CROSS_COMPILE' corresponding. - 4) make -f Make_ming.mak gvim.exe - - Now you have created the Windows binary from your Linux box! Have fun... - - ---- vim72.orig/src/Make_cyg.mak -+++ vim72/src/Make_cyg.mak -@@ -1,8 +1,8 @@ - # - # Makefile for VIM on Win32, using Cygnus gcc --# Last updated by Dan Sharp. Last Change: 2007 Sep 29 -+# Last updated by Dan Sharp. Last Change: 2010 Feb 24 - # - # Also read INSTALLpc.txt! - # - # This compiles Vim as a Windows application. If you want Vim to run as a - # Cygwin application use the Makefile (just like on Unix). -@@ -30,13 +30,16 @@ - # IME no or yes: set to yes to include IME support (yes) - # DYNAMIC_IME no or yes: set to yes to load imm32.dll dynamically (yes) - # OLE no or yes: set to yes to make OLE gvim (no) - # DEBUG no or yes: set to yes if you wish a DEBUGging build (no) - # CPUNR No longer supported, use ARCH. --# ARCH i386 through pentium4: select -march argument to compile with (i386) -+# ARCH i386 through pentium4: select -march argument to compile with -+# (i386) - # USEDLL no or yes: set to yes to use the Runtime library DLL (no) - # For USEDLL=yes the cygwin1.dll is required to run Vim. -+# "no" does not work with latest version of Cygwin, use -+# Make_ming.mak instead. Or set CC to gcc-3. - # POSTSCRIPT no or yes: set to yes for PostScript printing (no) - # FEATURES TINY, SMALL, NORMAL, BIG or HUGE (BIG) - # WINVER Lowest Win32 version to support. (0x0400) - # CSCOPE no or yes: to include cscope interface support (yes) - # OPTIMIZE SPACE, SPEED, or MAXSPEED: set optimization level (MAXSPEED) -@@ -97,10 +100,11 @@ endif - DEFINES = -DWIN32 -DHAVE_PATHDEF -DFEAT_$(FEATURES) \ - -DWINVER=$(WINVER) -D_WIN32_WINNT=$(WINVER) - INCLUDES = -march=$(ARCH) -Iproto - - #>>>>> name of the compiler and linker, name of lib directory -+CROSS_COMPILE = - CC = gcc - RC = windres - - ############################## - # DYNAMIC_PERL=yes and no both work -@@ -210,17 +214,38 @@ endif - - ifndef MZSCHEME_VER - MZSCHEME_VER = 209_000 - endif - -+ifndef MZSCHEME_PRECISE_GC -+MZSCHEME_PRECISE_GC=no -+endif -+ -+# for version 4.x we need to generate byte-code for Scheme base -+ifndef MZSCHEME_GENERATE_BASE -+MZSCHEME_GENERATE_BASE=no -+endif -+ - ifeq (yes, $(DYNAMIC_MZSCHEME)) - DEFINES += -DDYNAMIC_MZSCHEME -DDYNAMIC_MZSCH_DLL=\"libmzsch$(MZSCHEME_VER).dll\" -DDYNAMIC_MZGC_DLL=\"libmzgc$(MZSCHEME_VER).dll\" - else - ifndef MZSCHEME_DLLS - MZSCHEME_DLLS = $(MZSCHEME) - endif --EXTRA_LIBS += -L$(MZSCHEME_DLLS) -lmzsch$(MZSCHEME_VER) -lmzgc$(MZSCHEME_VER) -+ifeq (yes,$(MZSCHEME_PRECISE_GC)) -+MZSCHEME_LIB=-lmzsch$(MZSCHEME_VER) -+else -+MZSCHEME_LIB = -lmzsch$(MZSCHEME_VER) -lmzgc$(MZSCHEME_VER) -+endif -+EXTRA_LIBS += -L$(MZSCHEME_DLLS) -L$(MZSCHEME_DLLS)/lib $(MZSCHEME_LIB) -+endif -+ifeq (yes,$(MZSCHEME_GENERATE_BASE)) -+DEFINES += -DINCLUDE_MZSCHEME_BASE -+MZ_EXTRA_DEP += mzscheme_base.c -+endif -+ifeq (yes,$(MZSCHEME_PRECISE_GC)) -+DEFINES += -DMZ_PRECISE_GC - endif - endif - - ############################## - # DYNAMIC_TCL=yes and no both work. -@@ -444,14 +469,14 @@ all: $(EXE) xxd/xxd.exe vimrun.exe insta - # See /usr/doc/cygwin-doc-1.2/html/faq_toc.html#TOC93 for more information. - $(EXE): $(OUTDIR) $(OBJ) - $(CC) $(CFLAGS) -o $(EXE) $(OBJ) $(LIBS) -luuid -lole32 $(EXTRA_LIBS) - - xxd/xxd.exe: xxd/xxd.c -- $(MAKE) -C xxd -f Make_cyg.mak USEDLL=$(USEDLL) -+ $(MAKE) -C xxd -f Make_cyg.mak CC=$(CC) USEDLL=$(USEDLL) - - GvimExt/gvimext.dll: GvimExt/gvimext.cpp GvimExt/gvimext.rc GvimExt/gvimext.h -- $(MAKE) -C GvimExt -f Make_ming.mak -+ $(MAKE) -C GvimExt -f Make_ming.mak CROSS_COMPILE=$(CROSS_COMPILE) - - vimrun.exe: vimrun.c - $(CC) $(CFLAGS) -o vimrun.exe vimrun.c $(LIBS) - - install.exe: dosinst.c -@@ -471,10 +496,13 @@ clean: - -rmdir $(OUTDIR) - -$(DEL) $(EXE) vimrun.exe install.exe uninstal.exe - ifdef PERL - -$(DEL) if_perl.c - endif -+ifdef MZSCHEME -+ -$(DEL) mzscheme_base.c -+endif - -$(DEL) pathdef.c - $(MAKE) -C xxd -f Make_cyg.mak clean - $(MAKE) -C GvimExt -f Make_ming.mak clean - - distclean: clean -@@ -521,13 +549,19 @@ ifeq (16, $(RUBY_VER)) - endif - - $(OUTDIR)/netbeans.o: netbeans.c $(INCL) $(NBDEBUG_DEP) - $(CC) -c $(CFLAGS) netbeans.c -o $(OUTDIR)/netbeans.o - -+$(OUTDIR)/if_mzsch.o: if_mzsch.c $(INCL) if_mzsch.h $(MZ_EXTRA_DEP) -+ $(CC) -c $(CFLAGS) if_mzsch.c -o $(OUTDIR)/if_mzsch.o -+ - $(OUTDIR)/vimrc.o: vim.rc version.h gui_w32_rc.h - $(RC) $(RCFLAGS) vim.rc -o $(OUTDIR)/vimrc.o - -+mzscheme_base.c: -+ $(MZSCHEME)/mzc --c-mods mzscheme_base.c ++lib scheme/base -+ - pathdef.c: $(INCL) - ifneq (sh.exe, $(SHELL)) - @echo creating pathdef.c - @echo '/* pathdef.c */' > pathdef.c - @echo '#include "vim.h"' >> pathdef.c ---- vim72.orig/src/Make_ming.mak -+++ vim72/src/Make_ming.mak -@@ -113,18 +113,31 @@ endif - - ifndef MZSCHEME_VER - MZSCHEME_VER=205_000 - endif - -+ifndef MZSCHEME_PRECISE_GC -+MZSCHEME_PRECISE_GC=no -+endif -+ -+# for version 4.x we need to generate byte-code for Scheme base -+ifndef MZSCHEME_GENERATE_BASE -+MZSCHEME_GENERATE_BASE=no -+endif -+ - ifeq (no,$(DYNAMIC_MZSCHEME)) -+ifeq (yes,$(MZSCHEME_PRECISE_GC)) -+MZSCHEME_LIB=-lmzsch$(MZSCHEME_VER) -+else - MZSCHEME_LIB = -lmzsch$(MZSCHEME_VER) -lmzgc$(MZSCHEME_VER) -+endif - # the modern MinGW can dynamically link to dlls directly. - # point MZSCHEME_DLLS to where you put libmzschXXXXXXX.dll and libgcXXXXXXX.dll - ifndef MZSCHEME_DLLS - MZSCHEME_DLLS=$(MZSCHEME) - endif --MZSCHEME_LIBDIR=-L$(MZSCHEME_DLLS) -+MZSCHEME_LIBDIR=-L$(MZSCHEME_DLLS) -L$(MZSCHEME_DLLS)\lib - endif - - endif - - # Python support -- works with the ActiveState python 2.0 release (and others -@@ -197,27 +210,31 @@ RUBY_VER = 16 - endif - ifndef RUBY_VER_LONG - RUBY_VER_LONG = 1.6 - endif - --ifeq ($(RUBY_VER), 16) - ifndef RUBY_PLATFORM -+ifeq ($(RUBY_VER), 16) - RUBY_PLATFORM = i586-mswin32 --endif --ifndef RUBY_INSTALL_NAME --RUBY_INSTALL_NAME = mswin32-ruby$(RUBY_VER) --endif - else --ifndef RUBY_PLATFORM -+ifneq ($(wildcard $(RUBY)/lib/ruby/$(RUBY_VER_LONG)/i386-mingw32),) -+RUBY_PLATFORM = i386-mingw32 -+else - RUBY_PLATFORM = i386-mswin32 - endif -+endif -+endif -+ - ifndef RUBY_INSTALL_NAME -+ifeq ($(RUBY_VER), 16) -+RUBY_INSTALL_NAME = mswin32-ruby$(RUBY_VER) -+else - RUBY_INSTALL_NAME = msvcrt-ruby$(RUBY_VER) - endif - endif - --RUBYINC =-I $(RUBY)/lib/ruby/$(RUBY_VER_LONG)/$(RUBY_PLATFORM) -+RUBYINC =-I $(RUBY)/lib/ruby/$(RUBY_VER_LONG)/$(RUBY_PLATFORM) -I $(RUBY)/include/ruby-$(RUBY_VER_LONG) -I $(RUBY)/include/ruby-$(RUBY_VER_LONG)/$(RUBY_PLATFORM) - ifeq (no, $(DYNAMIC_RUBY)) - RUBYLIB = -L$(RUBY)/lib -l$(RUBY_INSTALL_NAME) - endif - - endif # RUBY -@@ -226,29 +243,30 @@ endif # RUBY - # Any other defines can be included here. - DEF_GUI=-DFEAT_GUI_W32 -DFEAT_CLIPBOARD - DEFINES=-DWIN32 -DWINVER=$(WINVER) -D_WIN32_WINNT=$(WINVER) \ - -DHAVE_PATHDEF -DFEAT_$(FEATURES) - ifeq ($(CROSS),yes) --# cross-compiler: --CC = i586-pc-mingw32msvc-gcc -+# cross-compiler prefix: -+CROSS_COMPILE = i586-pc-mingw32msvc- - DEL = rm - MKDIR = mkdir -p --WINDRES = i586-pc-mingw32msvc-windres -+DIRSLASH = / - else - # normal (Windows) compilation: --CC = gcc -+CROSS_COMPILE = - ifneq (sh.exe, $(SHELL)) - DEL = rm - MKDIR = mkdir -p - DIRSLASH = / - else - DEL = del - MKDIR = mkdir - DIRSLASH = \\ - endif --WINDRES = windres - endif -+CC := $(CROSS_COMPILE)gcc -+WINDRES := $(CROSS_COMPILE)windres - - #>>>>> end of choices - ########################################################################### - - CFLAGS = -Iproto $(DEFINES) -pipe -w -march=$(ARCH) -Wall -@@ -408,10 +426,17 @@ ifdef PERL - OBJ += $(OUTDIR)/if_perl.o - endif - ifdef MZSCHEME - OBJ += $(OUTDIR)/if_mzsch.o - MZSCHEME_INCL = if_mzsch.h -+ifeq (yes,$(MZSCHEME_GENERATE_BASE)) -+CFLAGS += -DINCLUDE_MZSCHEME_BASE -+MZ_EXTRA_DEP += mzscheme_base.c -+endif -+ifeq (yes,$(MZSCHEME_PRECISE_GC)) -+CFLAGS += -DMZ_PRECISE_GC -+endif - endif - ifdef PYTHON - OBJ += $(OUTDIR)/if_python.o - endif - ifdef RUBY -@@ -527,24 +552,27 @@ $(TARGET): $(OUTDIR) $(OBJ) - upx: exes - upx gvim.exe - upx vim.exe - - xxd/xxd.exe: xxd/xxd.c -- $(MAKE) -C xxd -f Make_cyg.mak -+ $(MAKE) -C xxd -f Make_cyg.mak CC=$(CC) - - GvimExt/gvimext.dll: GvimExt/gvimext.cpp GvimExt/gvimext.rc GvimExt/gvimext.h -- $(MAKE) -C GvimExt -f Make_ming.mak -+ $(MAKE) -C GvimExt -f Make_ming.mak CROSS=$(CROSS) CROSS_COMPILE=$(CROSS_COMPILE) - - clean: - -$(DEL) $(OUTDIR)$(DIRSLASH)*.o - -$(DEL) $(OUTDIR)$(DIRSLASH)*.res - -rmdir $(OUTDIR) - -$(DEL) *.exe - -$(DEL) pathdef.c - ifdef PERL - -$(DEL) if_perl.c - endif -+ifdef MZSCHEME -+ -$(DEL) mzscheme_base.c -+endif - $(MAKE) -C GvimExt -f Make_ming.mak clean - $(MAKE) -C xxd -f Make_cyg.mak clean - - ########################################################################### - INCL = vim.h feature.h os_win32.h os_dos.h ascii.h keymap.h term.h macros.h \ -@@ -586,10 +614,16 @@ if_perl.c: if_perl.xs typemap - $(PERLLIB)/ExtUtils/typemap if_perl.xs > $@ - - $(OUTDIR)/netbeans.o: netbeans.c $(INCL) $(NBDEBUG_INCL) $(NBDEBUG_SRC) - $(CC) -c $(CFLAGS) netbeans.c -o $(OUTDIR)/netbeans.o - -+$(OUTDIR)/if_mzsch.o: if_mzsch.c $(INCL) if_mzsch.h $(MZ_EXTRA_DEP) -+ $(CC) -c $(CFLAGS) if_mzsch.c -o $(OUTDIR)/if_mzsch.o -+ -+mzscheme_base.c: -+ $(MZSCHEME)/mzc --c-mods mzscheme_base.c ++lib scheme/base -+ - pathdef.c: $(INCL) - ifneq (sh.exe, $(SHELL)) - @echo creating pathdef.c - @echo '/* pathdef.c */' > pathdef.c - @echo '#include "vim.h"' >> pathdef.c ---- vim72.orig/src/Make_mvc.mak -+++ vim72/src/Make_mvc.mak -@@ -1,20 +1,20 @@ - # Makefile for Vim on Win32 (Windows NT/2000/XP/2003 and Windows 95/98/Me) - # and Win64, using the Microsoft Visual C++ compilers. Known to work with - # VC5, VC6 (VS98), VC7.0 (VS2002), VC7.1 (VS2003), VC8 (VS2005), --# and VC9 (VS2008). -+# VC9 (VS2008), and VC10 (VS2010). - # - # To build using other Windows compilers, see INSTALLpc.txt - # - # This makefile can build the console, GUI, OLE-enable, Perl-enabled and --# Python-enabled versions of vim for Win32 platforms. -+# Python-enabled versions of Vim for Win32 platforms. - # --# The basic command line to build vim is: -+# The basic command line to build Vim is: - # - # nmake -f Make_mvc.mak - # --# This will build the console version of vim with no additional interfaces. -+# This will build the console version of Vim with no additional interfaces. - # To add features, define any of the following: - # - # !!!! After changing features do "nmake clean" first !!!! - # - # Feature Set: FEATURES=[TINY, SMALL, NORMAL, BIG, HUGE] (default is BIG) -@@ -32,10 +32,11 @@ - # - # MzScheme interface: - # MZSCHEME=[Path to MzScheme directory] - # DYNAMIC_MZSCHEME=yes (to load the MzScheme DLLs dynamically) - # MZSCHEME_VER=[version, 205_000, ...] -+# MZSCHEME_DEBUG=no - # - # Perl interface: - # PERL=[Path to Perl directory] - # DYNAMIC_PERL=yes (to load the Perl DLL dynamically) - # PERL_VER=[Perl version, in the form 55 (5.005), 56 (5.6.x), etc] -@@ -352,10 +353,19 @@ MSVCVER = 8.0 - MSVCVER = 9.0 - !endif - !if "$(_NMAKE_VER)" == "9.00.21022.08" - MSVCVER = 9.0 - !endif -+!if "$(_NMAKE_VER)" == "9.00.30729.01" -+MSVCVER = 9.0 -+!endif -+!if "$(_NMAKE_VER)" == "10.00.20506.01" -+MSVCVER = 10.0 -+!endif -+!if "$(_NMAKE_VER)" == "10.00.30128.01" -+MSVCVER = 10.0 -+!endif - !endif - - # Abort bulding VIM if version of VC is unrecognised. - !ifndef MSVCVER - !message *** ERROR -@@ -366,11 +376,11 @@ MSVCVER = 9.0 - !message to handle the new value for _NMAKE_VER, "$(_NMAKE_VER)". - !error Make aborted. - !endif - - # Convert processor ID to MVC-compatible number --!if ("$(MSVCVER)" != "8.0") && ("$(MSVCVER)" != "9.0") -+!if ("$(MSVCVER)" != "8.0") && ("$(MSVCVER)" != "9.0") && ("$(MSVCVER)" != "10.0") - !if "$(CPUNR)" == "i386" - CPUARG = /G3 - !elseif "$(CPUNR)" == "i486" - CPUARG = /G4 - !elseif "$(CPUNR)" == "i586" -@@ -399,11 +409,11 @@ OPTFLAG = /O1 - !elseif "$(OPTIMIZE)" == "SPEED" - OPTFLAG = /O2 - !else # MAXSPEED - OPTFLAG = /Ox - !endif --!if ("$(MSVCVER)" == "8.0") || ("$(MSVCVER)" == "9.0") -+!if ("$(MSVCVER)" == "8.0") || ("$(MSVCVER)" == "9.0") || ("$(MSVCVER)" == "10.0") - # Use link time code generation if not worried about size - !if "$(OPTIMIZE)" != "SPACE" - OPTFLAG = $(OPTFLAG) /GL - !endif - !endif -@@ -616,19 +626,41 @@ PYTHON_LIB = $(PYTHON)\libs\python$(PYTH - !message MzScheme requested - root dir is "$(MZSCHEME)" - !ifndef MZSCHEME_VER - MZSCHEME_VER = 205_000 - !endif - CFLAGS = $(CFLAGS) -DFEAT_MZSCHEME -I $(MZSCHEME)\include -+!if EXIST("$(MZSCHEME)\collects\scheme\base.ss") -+# for MzScheme 4.x we need to include byte code for basic Scheme stuff -+MZSCHEME_EXTRA_DEP = mzscheme_base.c -+CFLAGS = $(CFLAGS) -DINCLUDE_MZSCHEME_BASE -+!endif -+!if EXIST("$(MZSCHEME)\lib\msvc\libmzsch$(MZSCHEME_VER).lib") \ -+ && !EXIST("$(MZSCHEME)\lib\msvc\libmzgc$(MZSCHEME_VER).lib") -+!message Building with Precise GC -+MZSCHEME_PRECISE_GC = yes -+CFLAGS = $(CFLAGS) -DMZ_PRECISE_GC -+!endif - !if "$(DYNAMIC_MZSCHEME)" == "yes" -+!if "$(MZSCHEME_PRECISE_GC)" == "yes" -+!error MzScheme with Precise GC cannot be loaded dynamically -+!endif - !message MzScheme DLLs will be loaded dynamically - CFLAGS = $(CFLAGS) -DDYNAMIC_MZSCHEME \ - -DDYNAMIC_MZSCH_DLL=\"libmzsch$(MZSCHEME_VER).dll\" \ - -DDYNAMIC_MZGC_DLL=\"libmzgc$(MZSCHEME_VER).dll\" - !else -+!if "$(MZSCHEME_DEBUG)" == "yes" -+CFLAGS = $(CFLAGS) -DMZSCHEME_FORCE_GC -+!endif -+!if "$(MZSCHEME_PRECISE_GC)" == "yes" -+# Precise GC does not use separate dll -+MZSCHEME_LIB = $(MZSCHEME)\lib\msvc\libmzsch$(MZSCHEME_VER).lib -+!else - MZSCHEME_LIB = $(MZSCHEME)\lib\msvc\libmzgc$(MZSCHEME_VER).lib \ - $(MZSCHEME)\lib\msvc\libmzsch$(MZSCHEME_VER).lib - !endif -+!endif - MZSCHEME_OBJ = $(OUTDIR)\if_mzsch.obj - !endif - - # Perl interface - !ifdef PERL -@@ -765,11 +797,11 @@ LINKARGS2 = $(CON_LIB) $(GUI_LIB) $(LIBC - $(MZSCHEME_LIB) $(PERL_LIB) $(PYTHON_LIB) $(RUBY_LIB) \ - $(TCL_LIB) $(NETBEANS_LIB) $(XPM_LIB) $(LINK_PDB) - - # Report link time code generation progress if used. - !ifdef NODEBUG --!if ("$(MSVCVER)" == "8.0") || ("$(MSVCVER)" == "9.0") -+!if ("$(MSVCVER)" == "8.0") || ("$(MSVCVER)" == "9.0") || ("$(MSVCVER)" == "10.0") - !if "$(OPTIMIZE)" != "SPACE" - LINKARGS1 = $(LINKARGS1) /LTCG:STATUS - !endif - !endif - !endif -@@ -834,10 +866,11 @@ clean: - - if exist if_perl.c del if_perl.c - - if exist dimm.h del dimm.h - - if exist dimm_i.c del dimm_i.c - - if exist dimm.tlb del dimm.tlb - - if exist dosinst.exe del dosinst.exe -+ - if exist mzscheme_base.c del mzscheme_base.c - cd xxd - $(MAKE) /NOLOGO -f Make_mvc.mak clean - cd .. - cd GvimExt - $(MAKE) /NOLOGO -f Makefile clean -@@ -925,13 +958,15 @@ $(OUTDIR)/if_perl.obj: $(OUTDIR) if_perl - $(CC) $(CFLAGS) $(PERL_INC) if_perl.c - - $(OUTDIR)/if_perlsfio.obj: $(OUTDIR) if_perlsfio.c $(INCL) - $(CC) $(CFLAGS) $(PERL_INC) if_perlsfio.c - --$(OUTDIR)/if_mzsch.obj: $(OUTDIR) if_mzsch.c $(INCL) -+$(OUTDIR)/if_mzsch.obj: $(OUTDIR) if_mzsch.c $(INCL) $(MZSCHEME_EXTRA_DEP) - $(CC) $(CFLAGS) if_mzsch.c \ - -DMZSCHEME_COLLECTS=\"$(MZSCHEME:\=\\)\\collects\" -+mzscheme_base.c: -+ $(MZSCHEME)\mzc --c-mods mzscheme_base.c ++lib scheme/base - - $(OUTDIR)/if_python.obj: $(OUTDIR) if_python.c $(INCL) - $(CC) $(CFLAGS) $(PYTHON_INC) if_python.c - - $(OUTDIR)/if_ole.obj: $(OUTDIR) if_ole.cpp $(INCL) if_ole.h -@@ -1007,11 +1042,11 @@ $(OUTDIR)/undo.obj: $(OUTDIR) undo.c $( - $(OUTDIR)/window.obj: $(OUTDIR) window.c $(INCL) - - $(OUTDIR)/xpm_w32.obj: $(OUTDIR) xpm_w32.c - $(CC) $(CFLAGS) $(XPM_INC) xpm_w32.c - --$(OUTDIR)/vim.res: $(OUTDIR) vim.rc version.h tools.bmp tearoff.bmp \ -+$(OUTDIR)/vim.res: $(OUTDIR) vim.rc gvim.exe.mnf version.h tools.bmp tearoff.bmp \ - vim.ico vim_error.ico vim_alert.ico vim_info.ico vim_quest.ico - $(RC) /l 0x409 /Fo$(OUTDIR)/vim.res $(RCFLAGS) vim.rc - - iid_ole.c if_ole.h vim.tlb: if_ole.idl - midl /nologo /error none /proxy nul /iid iid_ole.c /tlb vim.tlb \ ---- vim72.orig/src/Make_vms.mms -+++ vim72/src/Make_vms.mms -@@ -1,10 +1,10 @@ - # - # Makefile for Vim on OpenVMS - # - # Maintainer: Zoltan Arpadffy <arpadffy@polarhome.com> --# Last change: 2007 Oct 22 -+# Last change: 2008 Aug 16 - # - # This has script been tested on VMS 6.2 to 8.2 on DEC Alpha, VAX and IA64 - # with MMS and MMK - # - # The following could be built: -@@ -34,11 +34,11 @@ DECC = YES - # SMALL - Few features enabled, as basic as possible - # NORMAL - A default selection of features enabled - # BIG - Many features enabled, as rich as possible. (default) - # HUGE - All possible featues enabled. - # Please select one of these alternatives above. --MODEL = BIG -+MODEL = HUGE - - # GUI or terminal mode executable. - # Comment out if you want just the character terminal mode only. - # GUI with Motif - GUI = YES ---- vim72.orig/src/Makefile -+++ vim72/src/Makefile -@@ -103,12 +103,12 @@ - # solution for a non-standard system. - # - # 4. "make test" {{{1 - # This is optional. This will run Vim scripts on a number of test - # files, and compare the produced output with the expected output. --# If all is well, you will get the "ALL DONE" message in the end. See --# below (search for "/^test"). -+# If all is well, you will get the "ALL DONE" message in the end. If a -+# test fails you get "TEST FAILURE". See below (search for "/^test"). - # - # 5. "make install" {{{1 - # If the new Vim seems to be working OK you can install it and the - # documentation in the appropriate location. The default is - # "/usr/local". Change "prefix" below to change the location. -@@ -393,11 +393,13 @@ CClink = $(CC) - #CONF_OPT_TCL = --enable-tclinterp - #CONF_OPT_TCL = --enable-tclinterp --with-tclsh=tclsh8.4 - - # RUBY - # Uncomment this when you want to include the Ruby interface. --#CONF_OPT_RUBY = --enable-rubyinterp -+# Note: you need the development package (e.g., ruby1.9.1-dev on Ubuntu). -+# CONF_OPT_RUBY = --enable-rubyinterp -+# CONF_OPT_RUBY = --enable-rubyinterp --with-ruby-command=ruby1.9.1 - - # MZSCHEME - # Uncomment this when you want to include the MzScheme interface. - #CONF_OPT_MZSCHEME = --enable-mzschemeinterp - # PLT/mrscheme/drscheme Home dir; the PLTHOME environment variable also works -@@ -531,10 +533,15 @@ CClink = $(CC) - #CFLAGS = -g -Wall -Wmissing-prototypes - #CFLAGS = -O6 -fno-strength-reduce -Wall -Wshadow -Wmissing-prototypes - #CFLAGS = -g -DDEBUG -Wall -Wshadow -Wmissing-prototypes - #CFLAGS = -g -O2 '-DSTARTUPTIME="vimstartup"' -fno-strength-reduce -Wall -Wmissing-prototypes - -+# Use this with GCC to check for mistakes, unused arguments, etc. -+#CFLAGS = -g -Wall -Wextra -Wmissing-prototypes -Wunreachable-code -+#PYTHON_CFLAGS_EXTRA = -Wno-missing-field-initializers -+#MZSCHEME_CFLAGS_EXTRA = -Wno-unreachable-code -Wno-unused-parameter -+ - # EFENCE - Electric-Fence malloc debugging: catches memory accesses beyond - # allocated memory (and makes every malloc()/free() very slow). - # Electric Fence is free (search ftp sites). - # You may want to set the EF_PROTECT_BELOW environment variable to check the - # other side of allocated memory. -@@ -549,11 +556,17 @@ CClink = $(CC) - #EXTRA_DEFS = -DNBDEBUG - - # }}} - - # LINT - for running lint -+# For standard Unix lint -+LINT = lint - LINT_OPTIONS = -beprxzF -+# For splint -+# It doesn't work well, crashes on include files and non-ascii characters. -+#LINT = splint -+#LINT_OPTIONS = +unixlib -weak -macrovarprefixexclude -showfunc -linelen 9999 - - # PROFILING - Uncomment the next two lines to do profiling with gcc and gprof. - # Might not work with GUI or Perl. - # For unknown reasons adding "-lc" fixes a linking problem with GCC. That's - # probably a bug in the "-pg" implementation. -@@ -1257,20 +1270,20 @@ CPP_DEPEND = $(CC) -I$(srcdir) -M$(CPP_M - - # flags for cproto - # This is for cproto 3 patchlevel 8 or below - # __inline, __attribute__ and __extension__ are not recognized by cproto - # G_IMPLEMENT_INLINES is to avoid functions defined in glib/gutils.h. --NO_ATTR = -D__inline= -D__inline__= -DG_IMPLEMENT_INLINES \ -- -D"__attribute__\\(x\\)=" -D"__asm__\\(x\\)=" \ -- -D__extension__= -D__restrict="" \ -- -D__gnuc_va_list=char -D__builtin_va_list=char -+#NO_ATTR = -D__inline= -D__inline__= -DG_IMPLEMENT_INLINES \ -+# -D"__attribute__\\(x\\)=" -D"__asm__\\(x\\)=" \ -+# -D__extension__= -D__restrict="" \ -+# -D__gnuc_va_list=char -D__builtin_va_list=char - - # --# This is for cproto 3 patchlevel 9 or above (currently 4.6) -+# This is for cproto 3 patchlevel 9 or above (currently 4.6, 4.7g) - # __inline and __attribute__ are now recognized by cproto - # -D"foo()=" is not supported by all compilers so do not use it --# NO_ATTR= -+NO_ATTR= - # - # maybe the "/usr/bin/cc -E" has to be adjusted for some systems - # This is for cproto 3.5 patchlevel 3: - # PROTO_FLAGS = -f4 -m__ARGS -d -E"$(CPP)" $(NO_ATTR) - # -@@ -1430,10 +1443,11 @@ ALL_SRC = $(BASIC_SRC) $(ALL_GUI_SRC) $( - # The perl sources also don't work well with lint. - LINT_SRC = $(BASIC_SRC) $(GUI_SRC) $(HANGULIN_SRC) $(PYTHON_SRC) $(TCL_SRC) \ - $(SNIFF_SRC) $(WORKSHOP_SRC) $(WSDEBUG_SRC) $(NETBEANS_SRC) - #LINT_SRC = $(SRC) - #LINT_SRC = $(ALL_SRC) -+#LINT_SRC = $(BASIC_SRC) - - OBJ = \ - objects/buffer.o \ - objects/charset.o \ - objects/diff.o \ -@@ -1735,11 +1749,12 @@ types.vim: $(TAGS_SRC) $(TAGS_INCL) - # - # This will produce a lot of garbage on your screen, including a few error - # messages. Don't worry about that. - # If there is a real error, there will be a difference between "test.out" and - # a "test99.ok" file. --# If everything is alright, the final message will be "ALL DONE". -+# If everything is alright, the final message will be "ALL DONE". If not you -+# get "TEST FAILURE". - # - test check: - $(MAKE) -f Makefile $(VIMTARGET) - -if test -n "$(MAKEMO)" -a -f $(PODIR)/Makefile; then \ - cd $(PODIR); $(MAKE) -f Makefile check VIM=../$(VIMTARGET); \ -@@ -2185,10 +2200,11 @@ uninstall_runtime: - clean celan: testclean - -rm -f *.o objects/* core $(VIMTARGET).core $(VIMTARGET) vim xxd/*.o - -rm -f $(TOOLS) auto/osdef.h auto/pathdef.c auto/if_perl.c - -rm -f conftest* *~ auto/link.sed - -rm -rf $(APPDIR) -+ -rm -rf mzscheme_base.c - if test -d $(PODIR); then \ - cd $(PODIR); $(MAKE) prefix=$(DESTDIR)$(prefix) clean; \ - fi - - # Make a shadow directory for compilation on another system or with different -@@ -2270,16 +2286,16 @@ depend: - sed -e 's+^\([^ ]*\.o\)+objects/\1+' >> tmp_make; done - mv tmp_make Makefile - - # Run lint. Clean up the *.ln files that are sometimes left behind. - lint: -- lint $(LINT_OPTIONS) $(LINT_CFLAGS) $(LINT_EXTRA) $(LINT_SRC) -+ $(LINT) $(LINT_OPTIONS) $(LINT_CFLAGS) $(LINT_EXTRA) $(LINT_SRC) - -rm -f *.ln - - # Check dosinst.c with lint. - lintinstall: -- lint $(LINT_OPTIONS) -DWIN32 -DUNIX_LINT dosinst.c -+ $(LINT) $(LINT_OPTIONS) -DWIN32 -DUNIX_LINT dosinst.c - -rm -f dosinst.ln - - ########################################################################### - - .c.o: -@@ -2418,21 +2434,24 @@ objects/if_cscope.o: if_cscope.c - $(CCC) -o $@ if_cscope.c - - objects/if_xcmdsrv.o: if_xcmdsrv.c - $(CCC) -o $@ if_xcmdsrv.c - --objects/if_mzsch.o: if_mzsch.c -- $(CCC) -o $@ if_mzsch.c -+objects/if_mzsch.o: if_mzsch.c $(MZSCHEME_EXTRA) -+ $(CCC) -o $@ $(MZSCHEME_CFLAGS_EXTRA) if_mzsch.c -+ -+mzscheme_base.c: -+ $(MZSCHEME_MZC) --c-mods mzscheme_base.c ++lib scheme/base - - objects/if_perl.o: auto/if_perl.c - $(CCC) -o $@ auto/if_perl.c - - objects/if_perlsfio.o: if_perlsfio.c - $(CCC) -o $@ if_perlsfio.c - - objects/if_python.o: if_python.c -- $(CCC) -o $@ if_python.c -+ $(CCC) -o $@ $(PYTHON_CFLAGS_EXTRA) if_python.c - - objects/if_ruby.o: if_ruby.c - $(CCC) -o $@ if_ruby.c - - objects/if_sniff.o: if_sniff.c ---- vim72.orig/src/VisVim/Commands.cpp -+++ vim72/src/VisVim/Commands.cpp -@@ -18,100 +18,103 @@ static char THIS_FILE[] = __FILE__; - #define CD_NONE 2 // No cd - - - static BOOL g_bEnableVim = TRUE; // Vim enabled - static BOOL g_bDevStudioEditor = FALSE; // Open file in Dev Studio editor simultaneously -+static BOOL g_bNewTabs = FALSE; - static int g_ChangeDir = CD_NONE; // CD after file open? - --static void VimSetEnableState (BOOL bEnableState); --static BOOL VimOpenFile (BSTR& FileName, long LineNr); --static DISPID VimGetDispatchId (COleAutomationControl& VimOle, char* Method); --static void VimErrDiag (COleAutomationControl& VimOle); --static void VimChangeDir (COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName); --static void DebugMsg (char* Msg, char* Arg = NULL); -+static void VimSetEnableState(BOOL bEnableState); -+static BOOL VimOpenFile(BSTR& FileName, long LineNr); -+static DISPID VimGetDispatchId(COleAutomationControl& VimOle, char* Method); -+static void VimErrDiag(COleAutomationControl& VimOle); -+static void VimChangeDir(COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName); -+static void DebugMsg(char* Msg, char* Arg = NULL); - - - ///////////////////////////////////////////////////////////////////////////// - // CCommands - --CCommands::CCommands () -+CCommands::CCommands() - { - // m_pApplication == NULL; M$ Code generation bug!!! - m_pApplication = NULL; - m_pApplicationEventsObj = NULL; - m_pDebuggerEventsObj = NULL; - } - --CCommands::~CCommands () -+CCommands::~CCommands() - { -- ASSERT (m_pApplication != NULL); -+ ASSERT(m_pApplication != NULL); - if (m_pApplication) - { -- m_pApplication->Release (); -+ m_pApplication->Release(); - m_pApplication = NULL; - } - } - --void CCommands::SetApplicationObject (IApplication * pApplication) -+void CCommands::SetApplicationObject(IApplication * pApplication) - { - // This function assumes pApplication has already been AddRef'd - // for us, which CDSAddIn did in it's QueryInterface call - // just before it called us. - m_pApplication = pApplication; - if (! m_pApplication) - return; - - // Create Application event handlers -- XApplicationEventsObj::CreateInstance (&m_pApplicationEventsObj); -+ XApplicationEventsObj::CreateInstance(&m_pApplicationEventsObj); - if (! m_pApplicationEventsObj) - { -- ReportInternalError ("XApplicationEventsObj::CreateInstance"); -+ ReportInternalError("XApplicationEventsObj::CreateInstance"); - return; - } -- m_pApplicationEventsObj->AddRef (); -- m_pApplicationEventsObj->Connect (m_pApplication); -+ m_pApplicationEventsObj->AddRef(); -+ m_pApplicationEventsObj->Connect(m_pApplication); - m_pApplicationEventsObj->m_pCommands = this; - - #ifdef NEVER - // Create Debugger event handler - CComPtr < IDispatch > pDebugger; -- if (SUCCEEDED (m_pApplication->get_Debugger (&pDebugger)) -+ if (SUCCEEDED(m_pApplication->get_Debugger(&pDebugger)) - && pDebugger != NULL) - { -- XDebuggerEventsObj::CreateInstance (&m_pDebuggerEventsObj); -- m_pDebuggerEventsObj->AddRef (); -- m_pDebuggerEventsObj->Connect (pDebugger); -+ XDebuggerEventsObj::CreateInstance(&m_pDebuggerEventsObj); -+ m_pDebuggerEventsObj->AddRef(); -+ m_pDebuggerEventsObj->Connect(pDebugger); - m_pDebuggerEventsObj->m_pCommands = this; - } - #endif - - // Get settings from registry HKEY_CURRENT_USER\Software\Vim\VisVim -- HKEY hAppKey = GetAppKey ("Vim"); -+ HKEY hAppKey = GetAppKey("Vim"); - if (hAppKey) - { -- HKEY hSectionKey = GetSectionKey (hAppKey, "VisVim"); -+ HKEY hSectionKey = GetSectionKey(hAppKey, "VisVim"); - if (hSectionKey) - { -- g_bEnableVim = GetRegistryInt (hSectionKey, "EnableVim", -+ g_bEnableVim = GetRegistryInt(hSectionKey, "EnableVim", - g_bEnableVim); -- g_bDevStudioEditor = GetRegistryInt(hSectionKey,"DevStudioEditor", -- g_bDevStudioEditor); -- g_ChangeDir = GetRegistryInt (hSectionKey, "ChangeDir", -+ g_bDevStudioEditor = GetRegistryInt(hSectionKey, -+ "DevStudioEditor", g_bDevStudioEditor); -+ g_bNewTabs = GetRegistryInt(hSectionKey, "NewTabs", -+ g_bNewTabs); -+ g_ChangeDir = GetRegistryInt(hSectionKey, "ChangeDir", - g_ChangeDir); -- RegCloseKey (hSectionKey); -+ RegCloseKey(hSectionKey); - } -- RegCloseKey (hAppKey); -+ RegCloseKey(hAppKey); - } - } - --void CCommands::UnadviseFromEvents () -+void CCommands::UnadviseFromEvents() - { -- ASSERT (m_pApplicationEventsObj != NULL); -+ ASSERT(m_pApplicationEventsObj != NULL); - if (m_pApplicationEventsObj) - { -- m_pApplicationEventsObj->Disconnect (m_pApplication); -- m_pApplicationEventsObj->Release (); -+ m_pApplicationEventsObj->Disconnect(m_pApplication); -+ m_pApplicationEventsObj->Release(); - m_pApplicationEventsObj = NULL; - } - - #ifdef NEVER - if (m_pDebuggerEventsObj) -@@ -119,14 +122,14 @@ void CCommands::UnadviseFromEvents () - // Since we were able to connect to the Debugger events, we - // should be able to access the Debugger object again to - // unadvise from its events (thus the VERIFY_OK below--see - // stdafx.h). - CComPtr < IDispatch > pDebugger; -- VERIFY_OK (m_pApplication->get_Debugger (&pDebugger)); -- ASSERT (pDebugger != NULL); -- m_pDebuggerEventsObj->Disconnect (pDebugger); -- m_pDebuggerEventsObj->Release (); -+ VERIFY_OK(m_pApplication->get_Debugger(&pDebugger)); -+ ASSERT(pDebugger != NULL); -+ m_pDebuggerEventsObj->Disconnect(pDebugger); -+ m_pDebuggerEventsObj->Release(); - m_pDebuggerEventsObj = NULL; - } - #endif - } - -@@ -134,365 +137,372 @@ void CCommands::UnadviseFromEvents () - ///////////////////////////////////////////////////////////////////////////// - // Event handlers - - // Application events - --HRESULT CCommands::XApplicationEvents::BeforeBuildStart () -+HRESULT CCommands::XApplicationEvents::BeforeBuildStart() - { -- AFX_MANAGE_STATE (AfxGetStaticModuleState ()); -+ AFX_MANAGE_STATE(AfxGetStaticModuleState()); - return S_OK; - } - --HRESULT CCommands::XApplicationEvents::BuildFinish (long nNumErrors, long nNumWarnings) -+HRESULT CCommands::XApplicationEvents::BuildFinish(long nNumErrors, long nNumWarnings) - { -- AFX_MANAGE_STATE (AfxGetStaticModuleState ()); -+ AFX_MANAGE_STATE(AfxGetStaticModuleState()); - return S_OK; - } - --HRESULT CCommands::XApplicationEvents::BeforeApplicationShutDown () -+HRESULT CCommands::XApplicationEvents::BeforeApplicationShutDown() - { -- AFX_MANAGE_STATE (AfxGetStaticModuleState ()); -+ AFX_MANAGE_STATE(AfxGetStaticModuleState()); - return S_OK; - } - - // The open document event handle is the place where the real interface work - // is done. - // Vim gets called from here. - // --HRESULT CCommands::XApplicationEvents::DocumentOpen (IDispatch * theDocument) -+HRESULT CCommands::XApplicationEvents::DocumentOpen(IDispatch * theDocument) - { -- AFX_MANAGE_STATE (AfxGetStaticModuleState ()); -+ AFX_MANAGE_STATE(AfxGetStaticModuleState()); - - if (! g_bEnableVim) - // Vim not enabled or empty command line entered - return S_OK; - - // First get the current file name and line number - - // Get the document object -- CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc (theDocument); -+ CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc(theDocument); - if (! pDoc) - return S_OK; - - BSTR FileName; - long LineNr = -1; - - // Get the document name -- if (FAILED (pDoc->get_FullName (&FileName))) -+ if (FAILED(pDoc->get_FullName(&FileName))) - return S_OK; - - LPDISPATCH pDispSel; - - // Get a selection object dispatch pointer -- if (SUCCEEDED (pDoc->get_Selection (&pDispSel))) -+ if (SUCCEEDED(pDoc->get_Selection(&pDispSel))) - { - // Get the selection object -- CComQIPtr < ITextSelection, &IID_ITextSelection > pSel (pDispSel); -+ CComQIPtr < ITextSelection, &IID_ITextSelection > pSel(pDispSel); - - if (pSel) - // Get the selection line number -- pSel->get_CurrentLine (&LineNr); -+ pSel->get_CurrentLine(&LineNr); - -- pDispSel->Release (); -+ pDispSel->Release(); - } - - // Open the file in Vim and position to the current line -- if (VimOpenFile (FileName, LineNr)) -+ if (VimOpenFile(FileName, LineNr)) - { - if (! g_bDevStudioEditor) - { - // Close the document in developer studio - CComVariant vSaveChanges = dsSaveChangesPrompt; - DsSaveStatus Saved; - -- pDoc->Close (vSaveChanges, &Saved); -+ pDoc->Close(vSaveChanges, &Saved); - } - } - - // We're done here -- SysFreeString (FileName); -+ SysFreeString(FileName); - return S_OK; - } - --HRESULT CCommands::XApplicationEvents::BeforeDocumentClose (IDispatch * theDocument) -+HRESULT CCommands::XApplicationEvents::BeforeDocumentClose(IDispatch * theDocument) - { -- AFX_MANAGE_STATE (AfxGetStaticModuleState ()); -+ AFX_MANAGE_STATE(AfxGetStaticModuleState()); - return S_OK; - } - --HRESULT CCommands::XApplicationEvents::DocumentSave (IDispatch * theDocument) -+HRESULT CCommands::XApplicationEvents::DocumentSave(IDispatch * theDocument) - { -- AFX_MANAGE_STATE (AfxGetStaticModuleState ()); -+ AFX_MANAGE_STATE(AfxGetStaticModuleState()); - return S_OK; - } - --HRESULT CCommands::XApplicationEvents::NewDocument (IDispatch * theDocument) -+HRESULT CCommands::XApplicationEvents::NewDocument(IDispatch * theDocument) - { -- AFX_MANAGE_STATE (AfxGetStaticModuleState ()); -+ AFX_MANAGE_STATE(AfxGetStaticModuleState()); - - if (! g_bEnableVim) - // Vim not enabled or empty command line entered - return S_OK; - - // First get the current file name and line number - -- CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc (theDocument); -+ CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc(theDocument); - if (! pDoc) - return S_OK; - - BSTR FileName; - HRESULT hr; - -- hr = pDoc->get_FullName (&FileName); -- if (FAILED (hr)) -+ hr = pDoc->get_FullName(&FileName); -+ if (FAILED(hr)) - return S_OK; - - // Open the file in Vim and position to the current line -- if (VimOpenFile (FileName, 0)) -+ if (VimOpenFile(FileName, 0)) - { - if (! g_bDevStudioEditor) - { - // Close the document in developer studio - CComVariant vSaveChanges = dsSaveChangesPrompt; - DsSaveStatus Saved; - -- pDoc->Close (vSaveChanges, &Saved); -+ pDoc->Close(vSaveChanges, &Saved); - } - } - -- SysFreeString (FileName); -+ SysFreeString(FileName); - return S_OK; - } - --HRESULT CCommands::XApplicationEvents::WindowActivate (IDispatch * theWindow) -+HRESULT CCommands::XApplicationEvents::WindowActivate(IDispatch * theWindow) - { -- AFX_MANAGE_STATE (AfxGetStaticModuleState ()); -+ AFX_MANAGE_STATE(AfxGetStaticModuleState()); - return S_OK; - } - --HRESULT CCommands::XApplicationEvents::WindowDeactivate (IDispatch * theWindow) -+HRESULT CCommands::XApplicationEvents::WindowDeactivate(IDispatch * theWindow) - { -- AFX_MANAGE_STATE (AfxGetStaticModuleState ()); -+ AFX_MANAGE_STATE(AfxGetStaticModuleState()); - return S_OK; - } - --HRESULT CCommands::XApplicationEvents::WorkspaceOpen () -+HRESULT CCommands::XApplicationEvents::WorkspaceOpen() - { -- AFX_MANAGE_STATE (AfxGetStaticModuleState ()); -+ AFX_MANAGE_STATE(AfxGetStaticModuleState()); - return S_OK; - } - --HRESULT CCommands::XApplicationEvents::WorkspaceClose () -+HRESULT CCommands::XApplicationEvents::WorkspaceClose() - { -- AFX_MANAGE_STATE (AfxGetStaticModuleState ()); -+ AFX_MANAGE_STATE(AfxGetStaticModuleState()); - return S_OK; - } - --HRESULT CCommands::XApplicationEvents::NewWorkspace () -+HRESULT CCommands::XApplicationEvents::NewWorkspace() - { -- AFX_MANAGE_STATE (AfxGetStaticModuleState ()); -+ AFX_MANAGE_STATE(AfxGetStaticModuleState()); - return S_OK; - } - - // Debugger event - --HRESULT CCommands::XDebuggerEvents::BreakpointHit (IDispatch * pBreakpoint) -+HRESULT CCommands::XDebuggerEvents::BreakpointHit(IDispatch * pBreakpoint) - { -- AFX_MANAGE_STATE (AfxGetStaticModuleState ()); -+ AFX_MANAGE_STATE(AfxGetStaticModuleState()); - return S_OK; - } - - - ///////////////////////////////////////////////////////////////////////////// - // VisVim dialog - - class CMainDialog : public CDialog - { - public: -- CMainDialog (CWnd * pParent = NULL); // Standard constructor -+ CMainDialog(CWnd * pParent = NULL); // Standard constructor - - //{{AFX_DATA(CMainDialog) - enum { IDD = IDD_ADDINMAIN }; - int m_ChangeDir; - BOOL m_bDevStudioEditor; -+ BOOL m_bNewTabs; - //}}AFX_DATA - - //{{AFX_VIRTUAL(CMainDialog) - protected: -- virtual void DoDataExchange (CDataExchange * pDX); // DDX/DDV support -+ virtual void DoDataExchange(CDataExchange * pDX); // DDX/DDV support - //}}AFX_VIRTUAL - - protected: - //{{AFX_MSG(CMainDialog) - afx_msg void OnEnable(); - afx_msg void OnDisable(); - //}}AFX_MSG -- DECLARE_MESSAGE_MAP () -+ DECLARE_MESSAGE_MAP() - }; - --CMainDialog::CMainDialog (CWnd * pParent /* =NULL */ ) -- : CDialog (CMainDialog::IDD, pParent) -+CMainDialog::CMainDialog(CWnd * pParent /* =NULL */ ) -+ : CDialog(CMainDialog::IDD, pParent) - { - //{{AFX_DATA_INIT(CMainDialog) - m_ChangeDir = -1; - m_bDevStudioEditor = FALSE; -+ m_bNewTabs = FALSE; - //}}AFX_DATA_INIT - } - --void CMainDialog::DoDataExchange (CDataExchange * pDX) -+void CMainDialog::DoDataExchange(CDataExchange * pDX) - { -- CDialog::DoDataExchange (pDX); -+ CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CMainDialog) - DDX_Radio(pDX, IDC_CD_SOURCE_PATH, m_ChangeDir); -- DDX_Check (pDX, IDC_DEVSTUDIO_EDITOR, m_bDevStudioEditor); -+ DDX_Check(pDX, IDC_DEVSTUDIO_EDITOR, m_bDevStudioEditor); -+ DDX_Check(pDX, IDC_NEW_TABS, m_bNewTabs); - //}}AFX_DATA_MAP - } - --BEGIN_MESSAGE_MAP (CMainDialog, CDialog) -+BEGIN_MESSAGE_MAP(CMainDialog, CDialog) - //{{AFX_MSG_MAP(CMainDialog) - //}}AFX_MSG_MAP --END_MESSAGE_MAP () -+END_MESSAGE_MAP() - - - ///////////////////////////////////////////////////////////////////////////// - // CCommands methods - --STDMETHODIMP CCommands::VisVimDialog () -+STDMETHODIMP CCommands::VisVimDialog() - { -- AFX_MANAGE_STATE (AfxGetStaticModuleState ()); -+ AFX_MANAGE_STATE(AfxGetStaticModuleState()); - - // Use m_pApplication to access the Developer Studio Application - // object, - // and VERIFY_OK to see error strings in DEBUG builds of your add-in - // (see stdafx.h) - -- VERIFY_OK (m_pApplication->EnableModeless (VARIANT_FALSE)); -+ VERIFY_OK(m_pApplication->EnableModeless(VARIANT_FALSE)); - - CMainDialog Dlg; - - Dlg.m_bDevStudioEditor = g_bDevStudioEditor; -+ Dlg.m_bNewTabs = g_bNewTabs; - Dlg.m_ChangeDir = g_ChangeDir; -- if (Dlg.DoModal () == IDOK) -+ if (Dlg.DoModal() == IDOK) - { - g_bDevStudioEditor = Dlg.m_bDevStudioEditor; -+ g_bNewTabs = Dlg.m_bNewTabs; - g_ChangeDir = Dlg.m_ChangeDir; - - // Save settings to registry HKEY_CURRENT_USER\Software\Vim\VisVim -- HKEY hAppKey = GetAppKey ("Vim"); -+ HKEY hAppKey = GetAppKey("Vim"); - if (hAppKey) - { -- HKEY hSectionKey = GetSectionKey (hAppKey, "VisVim"); -+ HKEY hSectionKey = GetSectionKey(hAppKey, "VisVim"); - if (hSectionKey) - { -- WriteRegistryInt (hSectionKey, "DevStudioEditor", -+ WriteRegistryInt(hSectionKey, "DevStudioEditor", - g_bDevStudioEditor); -- WriteRegistryInt (hSectionKey, "ChangeDir", g_ChangeDir); -- RegCloseKey (hSectionKey); -+ WriteRegistryInt(hSectionKey, "NewTabs", -+ g_bNewTabs); -+ WriteRegistryInt(hSectionKey, "ChangeDir", g_ChangeDir); -+ RegCloseKey(hSectionKey); - } -- RegCloseKey (hAppKey); -+ RegCloseKey(hAppKey); - } - } - -- VERIFY_OK (m_pApplication->EnableModeless (VARIANT_TRUE)); -+ VERIFY_OK(m_pApplication->EnableModeless(VARIANT_TRUE)); - return S_OK; - } - --STDMETHODIMP CCommands::VisVimEnable () -+STDMETHODIMP CCommands::VisVimEnable() - { -- AFX_MANAGE_STATE (AfxGetStaticModuleState ()); -- VimSetEnableState (true); -+ AFX_MANAGE_STATE(AfxGetStaticModuleState()); -+ VimSetEnableState(true); - return S_OK; - } - --STDMETHODIMP CCommands::VisVimDisable () -+STDMETHODIMP CCommands::VisVimDisable() - { -- AFX_MANAGE_STATE (AfxGetStaticModuleState ()); -- VimSetEnableState (false); -+ AFX_MANAGE_STATE(AfxGetStaticModuleState()); -+ VimSetEnableState(false); - return S_OK; - } - --STDMETHODIMP CCommands::VisVimToggle () -+STDMETHODIMP CCommands::VisVimToggle() - { -- AFX_MANAGE_STATE (AfxGetStaticModuleState ()); -- VimSetEnableState (! g_bEnableVim); -+ AFX_MANAGE_STATE(AfxGetStaticModuleState()); -+ VimSetEnableState(! g_bEnableVim); - return S_OK; - } - --STDMETHODIMP CCommands::VisVimLoad () -+STDMETHODIMP CCommands::VisVimLoad() - { -- AFX_MANAGE_STATE (AfxGetStaticModuleState ()); -+ AFX_MANAGE_STATE(AfxGetStaticModuleState()); - - // Use m_pApplication to access the Developer Studio Application object, - // and VERIFY_OK to see error strings in DEBUG builds of your add-in - // (see stdafx.h) - - CComBSTR bStr; - // Define dispatch pointers for document and selection objects - CComPtr < IDispatch > pDispDoc, pDispSel; - - // Get a document object dispatch pointer -- VERIFY_OK (m_pApplication->get_ActiveDocument (&pDispDoc)); -+ VERIFY_OK(m_pApplication->get_ActiveDocument(&pDispDoc)); - if (! pDispDoc) - return S_OK; - - BSTR FileName; - long LineNr = -1; - - // Get the document object -- CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc (pDispDoc); -+ CComQIPtr < ITextDocument, &IID_ITextDocument > pDoc(pDispDoc); - - if (! pDoc) - return S_OK; - - // Get the document name -- if (FAILED (pDoc->get_FullName (&FileName))) -+ if (FAILED(pDoc->get_FullName(&FileName))) - return S_OK; - - // Get a selection object dispatch pointer -- if (SUCCEEDED (pDoc->get_Selection (&pDispSel))) -+ if (SUCCEEDED(pDoc->get_Selection(&pDispSel))) - { - // Get the selection object -- CComQIPtr < ITextSelection, &IID_ITextSelection > pSel (pDispSel); -+ CComQIPtr < ITextSelection, &IID_ITextSelection > pSel(pDispSel); - - if (pSel) - // Get the selection line number -- pSel->get_CurrentLine (&LineNr); -+ pSel->get_CurrentLine(&LineNr); - } - - // Open the file in Vim -- VimOpenFile (FileName, LineNr); -+ VimOpenFile(FileName, LineNr); - -- SysFreeString (FileName); -+ SysFreeString(FileName); - return S_OK; - } - - - // - // Here we do the actual processing and communication with Vim - // - - // Set the enable state and save to registry - // --static void VimSetEnableState (BOOL bEnableState) -+static void VimSetEnableState(BOOL bEnableState) - { - g_bEnableVim = bEnableState; -- HKEY hAppKey = GetAppKey ("Vim"); -+ HKEY hAppKey = GetAppKey("Vim"); - if (hAppKey) - { -- HKEY hSectionKey = GetSectionKey (hAppKey, "VisVim"); -+ HKEY hSectionKey = GetSectionKey(hAppKey, "VisVim"); - if (hSectionKey) -- WriteRegistryInt (hSectionKey, "EnableVim", g_bEnableVim); -- RegCloseKey (hAppKey); -+ WriteRegistryInt(hSectionKey, "EnableVim", g_bEnableVim); -+ RegCloseKey(hAppKey); - } - } - - // Open the file 'FileName' in Vim and goto line 'LineNr' - // 'FileName' is expected to contain an absolute DOS path including the drive - // letter. - // 'LineNr' must contain a valid line number or 0, e. g. for a new file - // --static BOOL VimOpenFile (BSTR& FileName, long LineNr) -+static BOOL VimOpenFile(BSTR& FileName, long LineNr) - { - - // OLE automation object for com. with Vim - // When the object goes out of scope, it's destructor destroys the OLE - // connection; -@@ -505,11 +515,11 @@ static BOOL VimOpenFile (BSTR& FileName, - // :cd D:/Src2/VisVim/ - // - // Get a dispatch id for the SendKeys method of Vim; - // enables connection to Vim if necessary - DISPID DispatchId; -- DispatchId = VimGetDispatchId (VimOle, "SendKeys"); -+ DispatchId = VimGetDispatchId(VimOle, "SendKeys"); - if (! DispatchId) - // OLE error, can't obtain dispatch id - goto OleError; - - OLECHAR Buf[MAX_OLE_STR]; -@@ -523,24 +533,32 @@ static BOOL VimOpenFile (BSTR& FileName, - VimCmd[2] = 0; - - #ifdef SINGLE_WINDOW - // Update the current file in Vim if it has been modified. - // Disabled, because it could write the file when you don't want to. -- sprintf (VimCmd + 2, ":up\n"); -+ sprintf(VimCmd + 2, ":up\n"); - #endif -- if (! VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf))) -+ if (! VimOle.Method(DispatchId, "s", TO_OLE_STR_BUF(VimCmd, Buf))) - goto OleError; - - // Change Vim working directory to where the file is if desired - if (g_ChangeDir != CD_NONE) -- VimChangeDir (VimOle, DispatchId, FileName); -+ VimChangeDir(VimOle, DispatchId, FileName); - - // Make Vim open the file. - // In the filename convert all \ to /, put a \ before a space. -- sprintf(VimCmd, ":drop "); -+ if (g_bNewTabs) -+ { -+ sprintf(VimCmd, ":tab drop "); -+ s = VimCmd + 11; -+ } -+ else -+ { -+ sprintf(VimCmd, ":drop "); -+ s = VimCmd + 6; -+ } - sprintf(FileNameTmp, "%S", (char *)FileName); -- s = VimCmd + 6; - for (p = FileNameTmp; *p != '\0' && s < FileNameTmp + MAX_OLE_STR - 4; - ++p) - if (*p == '\\') - *s++ = '/'; - else -@@ -550,51 +568,51 @@ static BOOL VimOpenFile (BSTR& FileName, - *s++ = *p; - } - *s++ = '\n'; - *s = '\0'; - -- if (! VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf))) -+ if (! VimOle.Method(DispatchId, "s", TO_OLE_STR_BUF(VimCmd, Buf))) - goto OleError; - - if (LineNr > 0) - { - // Goto line -- sprintf (VimCmd, ":%d\n", LineNr); -- if (! VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf))) -+ sprintf(VimCmd, ":%d\n", LineNr); -+ if (! VimOle.Method(DispatchId, "s", TO_OLE_STR_BUF(VimCmd, Buf))) - goto OleError; - } - - // Make Vim come to the foreground -- if (! VimOle.Method ("SetForeground")) -- VimOle.ErrDiag (); -+ if (! VimOle.Method("SetForeground")) -+ VimOle.ErrDiag(); - - // We're done - return true; - - OleError: - // There was an OLE error - // Check if it's the "unknown class string" error -- VimErrDiag (VimOle); -+ VimErrDiag(VimOle); - return false; - } - - // Return the dispatch id for the Vim method 'Method' - // Create the Vim OLE object if necessary - // Returns a valid dispatch id or null on error - // --static DISPID VimGetDispatchId (COleAutomationControl& VimOle, char* Method) -+static DISPID VimGetDispatchId(COleAutomationControl& VimOle, char* Method) - { - // Initialize Vim OLE connection if not already done -- if (! VimOle.IsCreated ()) -+ if (! VimOle.IsCreated()) - { -- if (! VimOle.CreateObject ("Vim.Application")) -+ if (! VimOle.CreateObject("Vim.Application")) - return NULL; - } - - // Get the dispatch id for the SendKeys method. - // By doing this, we are checking if Vim is still there... -- DISPID DispatchId = VimOle.GetDispatchId ("SendKeys"); -+ DISPID DispatchId = VimOle.GetDispatchId("SendKeys"); - if (! DispatchId) - { - // We can't get a dispatch id. - // This means that probably Vim has been terminated. - // Don't issue an error message here, instead -@@ -602,62 +620,62 @@ static DISPID VimGetDispatchId (COleAuto - // - // In fact, this should never happen, because the OLE aut. object - // should not be kept long enough to allow the user to terminate Vim - // to avoid memory corruption (why the heck is there no system garbage - // collection for those damned OLE memory chunks???). -- VimOle.DeleteObject (); -- if (! VimOle.CreateObject ("Vim.Application")) -+ VimOle.DeleteObject(); -+ if (! VimOle.CreateObject("Vim.Application")) - // If this create fails, it's time for an error msg - return NULL; - -- if (! (DispatchId = VimOle.GetDispatchId ("SendKeys"))) -+ if (! (DispatchId = VimOle.GetDispatchId("SendKeys"))) - // There is something wrong... - return NULL; - } - - return DispatchId; - } - - // Output an error message for an OLE error - // Check on the classstring error, which probably means Vim wasn't registered. - // --static void VimErrDiag (COleAutomationControl& VimOle) -+static void VimErrDiag(COleAutomationControl& VimOle) - { -- SCODE sc = GetScode (VimOle.GetResult ()); -+ SCODE sc = GetScode(VimOle.GetResult()); - if (sc == CO_E_CLASSSTRING) - { - char Buf[256]; -- sprintf (Buf, "There is no registered OLE automation server named " -+ sprintf(Buf, "There is no registered OLE automation server named " - "\"Vim.Application\".\n" - "Use the OLE-enabled version of Vim with VisVim and " - "make sure to register Vim by running \"vim -register\"."); -- MessageBox (NULL, Buf, "OLE Error", MB_OK); -+ MessageBox(NULL, Buf, "OLE Error", MB_OK); - } - else -- VimOle.ErrDiag (); -+ VimOle.ErrDiag(); - } - - // Change directory to the directory the file 'FileName' is in or it's parent - // directory according to the setting of the global 'g_ChangeDir': - // 'FileName' is expected to contain an absolute DOS path including the drive - // letter. - // CD_NONE - // CD_SOURCE_PATH - // CD_SOURCE_PARENT - // --static void VimChangeDir (COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName) -+static void VimChangeDir(COleAutomationControl& VimOle, DISPID DispatchId, BSTR& FileName) - { - // Do a :cd first - - // Get the path name of the file ("dir/") - CString StrFileName = FileName; - char Drive[_MAX_DRIVE]; - char Dir[_MAX_DIR]; - char DirUnix[_MAX_DIR * 2]; - char *s, *t; - -- _splitpath (StrFileName, Drive, Dir, NULL, NULL); -+ _splitpath(StrFileName, Drive, Dir, NULL, NULL); - - // Convert to Unix path name format, escape spaces. - t = DirUnix; - for (s = Dir; *s; ++s) - if (*s == '\\') -@@ -674,21 +692,20 @@ static void VimChangeDir (COleAutomation - // Construct the cd command; append /.. if cd to parent - // directory and not in root directory - OLECHAR Buf[MAX_OLE_STR]; - char VimCmd[MAX_OLE_STR]; - -- sprintf (VimCmd, ":cd %s%s%s\n", Drive, DirUnix, -+ sprintf(VimCmd, ":cd %s%s%s\n", Drive, DirUnix, - g_ChangeDir == CD_SOURCE_PARENT && DirUnix[1] ? ".." : ""); -- VimOle.Method (DispatchId, "s", TO_OLE_STR_BUF (VimCmd, Buf)); -+ VimOle.Method(DispatchId, "s", TO_OLE_STR_BUF(VimCmd, Buf)); - } - - #ifdef _DEBUG - // Print out a debug message - // --static void DebugMsg (char* Msg, char* Arg) -+static void DebugMsg(char* Msg, char* Arg) - { - char Buf[400]; -- sprintf (Buf, Msg, Arg); -- AfxMessageBox (Buf); -+ sprintf(Buf, Msg, Arg); -+ AfxMessageBox(Buf); - } - #endif -- ---- vim72.orig/src/VisVim/Resource.h -+++ vim72/src/VisVim/Resource.h -@@ -14,10 +14,11 @@ - #define IDD_ADDINMAIN 130 - #define IDC_DEVSTUDIO_EDITOR 1000 - #define IDC_CD_SOURCE_PATH 1001 - #define IDC_CD_SOURCE_PARENT 1002 - #define IDC_CD_NONE 1003 -+#define IDC_NEW_TABS 1004 - - // Next default values for new objects - // - #ifdef APSTUDIO_INVOKED - #ifndef APSTUDIO_READONLY_SYMBOLS ---- vim72.orig/src/VisVim/VisVim.rc -+++ vim72/src/VisVim/VisVim.rc -@@ -120,10 +120,13 @@ CAPTION "Vim Add-In 1.4" - FONT 8, "MS Sans Serif" - BEGIN - CONTROL "&Open file in DevStudio editor simultaneously", - IDC_DEVSTUDIO_EDITOR,"Button",BS_AUTOCHECKBOX | WS_GROUP | - WS_TABSTOP,7,7,153,10 -+ CONTROL "Open files in new tabs", -+ IDC_NEW_TABS,"Button",BS_AUTOCHECKBOX | WS_GROUP | -+ WS_TABSTOP,7,21,153,10 - GROUPBOX "Current directory",IDC_STATIC,7,35,164,58,WS_GROUP - CONTROL "Set to &source file path",IDC_CD_SOURCE_PATH,"Button", - BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,17,49,85,10 - CONTROL "Set to &parent directory of source file path", - IDC_CD_SOURCE_PARENT,"Button",BS_AUTORADIOBUTTON,17,63, ---- vim72.orig/src/auto/configure -+++ vim72/src/auto/configure -@@ -1,8 +1,8 @@ - #! /bin/sh - # Guess values for system-dependent variables and create Makefiles. --# Generated by GNU Autoconf 2.62. -+# Generated by GNU Autoconf 2.63. - # - # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, - # 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. - # This configure script is free software; the Free Software Foundation - # gives unlimited permission to copy, distribute and modify it. -@@ -633,147 +633,151 @@ ac_includes_default="\ - #endif - #ifdef HAVE_UNISTD_H - # include <unistd.h> - #endif" - --ac_subst_vars='SHELL --PATH_SEPARATOR --PACKAGE_NAME --PACKAGE_TARNAME --PACKAGE_VERSION --PACKAGE_STRING --PACKAGE_BUGREPORT --exec_prefix --prefix --program_transform_name --bindir --sbindir --libexecdir --datarootdir --datadir --sysconfdir --sharedstatedir --localstatedir --includedir --oldincludedir --docdir --infodir --htmldir --dvidir --pdfdir --psdir --libdir --localedir --mandir --DEFS --ECHO_C --ECHO_N --ECHO_T --LIBS --build_alias --host_alias --target_alias --SET_MAKE --CC --CFLAGS --LDFLAGS --CPPFLAGS --ac_ct_CC --EXEEXT --OBJEXT --CPP --GREP --EGREP --AWK --STRIP --CPP_MM --OS_EXTRA_SRC --OS_EXTRA_OBJ --VIMNAME --EXNAME --VIEWNAME --line_break --dovimdiff --dogvimdiff --compiledby --vi_cv_path_mzscheme --MZSCHEME_SRC --MZSCHEME_OBJ --MZSCHEME_PRO --MZSCHEME_LIBS --MZSCHEME_CFLAGS --vi_cv_path_perl --vi_cv_perllib --shrpenv --PERL_SRC --PERL_OBJ --PERL_PRO --PERL_CFLAGS --PERL_LIBS --vi_cv_path_python --PYTHON_CONFDIR --PYTHON_LIBS --PYTHON_GETPATH_CFLAGS --PYTHON_CFLAGS --PYTHON_SRC --PYTHON_OBJ --vi_cv_path_tcl --TCL_SRC --TCL_OBJ --TCL_PRO --TCL_CFLAGS --TCL_LIBS --vi_cv_path_ruby --RUBY_SRC --RUBY_OBJ --RUBY_PRO --RUBY_CFLAGS --RUBY_LIBS --WORKSHOP_SRC --WORKSHOP_OBJ --NETBEANS_SRC --NETBEANS_OBJ --SNIFF_SRC --SNIFF_OBJ --xmkmfpath --XMKMF --X_CFLAGS --X_PRE_LIBS --X_LIBS --X_EXTRA_LIBS --X_LIB --GTK_CONFIG --GTK12_CONFIG --PKG_CONFIG --GTK_CFLAGS --GTK_LIBS --GTK_LIBNAME --GNOME_LIBS --GNOME_LIBDIR --GNOME_INCLUDEDIR --GNOME_CONFIG --MOTIF_LIBNAME --NARROW_PROTO --GUI_INC_LOC --GUI_LIB_LOC --GUITYPE --GUI_X_LIBS --HANGULIN_SRC --HANGULIN_OBJ --TAGPRG --INSTALL_LANGS --INSTALL_TOOL_LANGS --MSGFMT --MAKEMO --DEPEND_CFLAGS_FILTER -+ac_subst_vars='LTLIBOBJS - LIBOBJS --LTLIBOBJS' -+DEPEND_CFLAGS_FILTER -+MAKEMO -+MSGFMT -+INSTALL_TOOL_LANGS -+INSTALL_LANGS -+TAGPRG -+HANGULIN_OBJ -+HANGULIN_SRC -+GUI_X_LIBS -+GUITYPE -+GUI_LIB_LOC -+GUI_INC_LOC -+NARROW_PROTO -+MOTIF_LIBNAME -+GNOME_CONFIG -+GNOME_INCLUDEDIR -+GNOME_LIBDIR -+GNOME_LIBS -+GTK_LIBNAME -+GTK_LIBS -+GTK_CFLAGS -+PKG_CONFIG -+GTK12_CONFIG -+GTK_CONFIG -+X_LIB -+X_EXTRA_LIBS -+X_LIBS -+X_PRE_LIBS -+X_CFLAGS -+XMKMF -+xmkmfpath -+SNIFF_OBJ -+SNIFF_SRC -+NETBEANS_OBJ -+NETBEANS_SRC -+WORKSHOP_OBJ -+WORKSHOP_SRC -+RUBY_LIBS -+RUBY_CFLAGS -+RUBY_PRO -+RUBY_OBJ -+RUBY_SRC -+vi_cv_path_ruby -+TCL_LIBS -+TCL_CFLAGS -+TCL_PRO -+TCL_OBJ -+TCL_SRC -+vi_cv_path_tcl -+PYTHON_OBJ -+PYTHON_SRC -+PYTHON_CFLAGS -+PYTHON_GETPATH_CFLAGS -+PYTHON_LIBS -+PYTHON_CONFDIR -+vi_cv_path_python -+PERL_LIBS -+PERL_CFLAGS -+PERL_PRO -+PERL_OBJ -+PERL_SRC -+shrpenv -+vi_cv_perllib -+vi_cv_path_perl -+MZSCHEME_MZC -+MZSCHEME_EXTRA -+MZSCHEME_CFLAGS -+MZSCHEME_LIBS -+MZSCHEME_PRO -+MZSCHEME_OBJ -+MZSCHEME_SRC -+vi_cv_path_mzscheme -+compiledby -+dogvimdiff -+dovimdiff -+line_break -+VIEWNAME -+EXNAME -+VIMNAME -+OS_EXTRA_OBJ -+OS_EXTRA_SRC -+XCODE_SELECT -+CPP_MM -+STRIP -+AWK -+EGREP -+GREP -+CPP -+OBJEXT -+EXEEXT -+ac_ct_CC -+CPPFLAGS -+LDFLAGS -+CFLAGS -+CC -+SET_MAKE -+target_alias -+host_alias -+build_alias -+LIBS -+ECHO_T -+ECHO_N -+ECHO_C -+DEFS -+mandir -+localedir -+libdir -+psdir -+pdfdir -+dvidir -+htmldir -+infodir -+docdir -+oldincludedir -+includedir -+localstatedir -+sharedstatedir -+sysconfdir -+datadir -+datarootdir -+libexecdir -+sbindir -+bindir -+program_transform_name -+prefix -+exec_prefix -+PACKAGE_BUGREPORT -+PACKAGE_STRING -+PACKAGE_VERSION -+PACKAGE_TARNAME -+PACKAGE_NAME -+PATH_SEPARATOR -+SHELL' - ac_subst_files='' - ac_user_opts=' - enable_option_checking - enable_darwin - with_mac_arch -+with_developer_dir - with_local_dir - with_vim_name - with_ex_name - with_view_name - with_global_runtime -@@ -789,10 +793,11 @@ enable_perlinterp - enable_pythoninterp - with_python_config_dir - enable_tclinterp - with_tclsh - enable_rubyinterp -+with_ruby_command - enable_cscope - enable_workshop - enable_netbeans - enable_sniff - enable_multibyte -@@ -1251,13 +1256,13 @@ if test -n "$ac_prev"; then - fi - - if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; -- fatal) { $as_echo "$as_me: error: Unrecognized options: $ac_unrecognized_opts" >&2 -+ fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 - { (exit 1); exit 1; }; } ;; -- *) $as_echo "$as_me: WARNING: Unrecognized options: $ac_unrecognized_opts" >&2 ;; -+ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac - fi - - # Check all directory arguments for consistency. - for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ -@@ -1306,11 +1311,11 @@ test "$silent" = yes && exec 6>/dev/null - - - ac_pwd=`pwd` && test -n "$ac_pwd" && - ac_ls_di=`ls -di .` && - ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || -- { $as_echo "$as_me: error: Working directory cannot be determined" >&2 -+ { $as_echo "$as_me: error: working directory cannot be determined" >&2 - { (exit 1); exit 1; }; } - test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 - { (exit 1); exit 1; }; } - -@@ -1487,10 +1492,11 @@ Optional Features: - - Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-mac-arch=ARCH current, intel, ppc or both -+ --with-developer-dir=PATH use PATH as location for Xcode developer tools - --with-local-dir=PATH search PATH instead of /usr/local for local libraries. - --without-local-dir do not search /usr/local for local libraries. - --with-vim-name=NAME what to call the Vim executable - --with-ex-name=NAME what to call the Ex executable - --with-view-name=NAME what to call the View executable -@@ -1499,10 +1505,11 @@ Optional Packages: - --with-features=TYPE tiny, small, normal, big or huge (default: normal) - --with-compiledby=NAME name to show in :version message - --with-plthome=PLTHOME Use PLTHOME. - --with-python-config-dir=PATH Python's config directory - --with-tclsh=PATH which tclsh to use (default: tclsh8.0) -+ --with-ruby-command=RUBY name of the Ruby command (default: ruby) - --with-x use the X Window System - --with-gtk-prefix=PFX Prefix where GTK is installed (optional) - --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional) - --with-gnome-includes=DIR Specify location of GNOME headers - --with-gnome-libs=DIR Specify location of GNOME libs -@@ -1585,11 +1592,11 @@ fi - - test -n "$ac_init_help" && exit $ac_status - if $ac_init_version; then - cat <<\_ACEOF - configure --generated by GNU Autoconf 2.62 -+generated by GNU Autoconf 2.63 - - Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, - 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. - This configure script is free software; the Free Software Foundation - gives unlimited permission to copy, distribute and modify it. -@@ -1599,11 +1606,11 @@ fi - cat >auto/config.log <<_ACEOF - This file contains any messages produced by compilers while - running configure, to aid debugging if configure makes a mistake. - - It was created by $as_me, which was --generated by GNU Autoconf 2.62. Invocation command line was -+generated by GNU Autoconf 2.63. Invocation command line was - - $ $0 $@ - - _ACEOF - exec 5>>auto/config.log -@@ -1722,12 +1729,12 @@ _ASBOX - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( -- *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 --$as_echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; -+ *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 -+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) $as_unset $ac_var ;; -@@ -1926,10 +1933,12 @@ $as_echo "$as_me: current value: \`$ac - *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; - esac - fi - done - if $ac_cache_corrupted; then -+ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 - $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 - $as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} - { (exit 1); exit 1; }; } -@@ -2082,16 +2091,12 @@ fi - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in - yes:) --{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools --whose name does not start with the host triplet. If you think this --configuration is useful to you, please write to autoconf@gnu.org." >&5 --$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools --whose name does not start with the host triplet. If you think this --configuration is useful to you, please write to autoconf@gnu.org." >&2;} -+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 -+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} - ac_tool_warned=yes ;; - esac - CC=$ac_ct_CC - fi - else -@@ -2286,30 +2291,28 @@ done - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in - yes:) --{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools --whose name does not start with the host triplet. If you think this --configuration is useful to you, please write to autoconf@gnu.org." >&5 --$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools --whose name does not start with the host triplet. If you think this --configuration is useful to you, please write to autoconf@gnu.org." >&2;} -+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 -+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} - ac_tool_warned=yes ;; - esac - CC=$ac_ct_CC - fi - fi - - fi - - --test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH -+test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH - See \`config.log' for more details." >&5 - $as_echo "$as_me: error: no acceptable C compiler found in \$PATH - See \`config.log' for more details." >&2;} -- { (exit 1); exit 1; }; } -+ { (exit 1); exit 1; }; }; } - - # Provide some information about the compiler. - $as_echo "$as_me:$LINENO: checking for C compiler version" >&5 - set X $ac_compile - ac_compiler=$2 -@@ -2435,15 +2438,17 @@ fi - $as_echo "$ac_file" >&6; } - if test -z "$ac_file"; then - $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - -+{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables - See \`config.log' for more details." >&5 - $as_echo "$as_me: error: C compiler cannot create executables - See \`config.log' for more details." >&2;} -- { (exit 77); exit 77; }; } -+ { (exit 77); exit 77; }; }; } - fi - - ac_exeext=$ac_cv_exeext - - # Check that the compiler produces executables we can run. If not, either -@@ -2467,17 +2472,19 @@ $as_echo "$ac_try_echo") >&5 - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else -- { { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs. -+ { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs. - If you meant to cross compile, use \`--host'. - See \`config.log' for more details." >&5 - $as_echo "$as_me: error: cannot run C compiled programs. - If you meant to cross compile, use \`--host'. - See \`config.log' for more details." >&2;} -- { (exit 1); exit 1; }; } -+ { (exit 1); exit 1; }; }; } - fi - fi - fi - { $as_echo "$as_me:$LINENO: result: yes" >&5 - $as_echo "yes" >&6; } -@@ -2516,15 +2523,17 @@ for ac_file in conftest.exe conftest con - break;; - * ) break;; - esac - done - else -- { { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link -+ { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link - See \`config.log' for more details." >&5 - $as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link - See \`config.log' for more details." >&2;} -- { (exit 1); exit 1; }; } -+ { (exit 1); exit 1; }; }; } - fi - - rm -f conftest$ac_cv_exeext - { $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 - $as_echo "$ac_cv_exeext" >&6; } -@@ -2574,15 +2583,17 @@ $as_echo "$ac_try_echo") >&5 - done - else - $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - -+{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile - See \`config.log' for more details." >&5 - $as_echo "$as_me: error: cannot compute suffix of object files: cannot compile - See \`config.log' for more details." >&2;} -- { (exit 1); exit 1; }; } -+ { (exit 1); exit 1; }; }; } - fi - - rm -f conftest.$ac_cv_objext conftest.$ac_ext - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 -@@ -3146,15 +3157,17 @@ done - # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. - rm -f conftest.err conftest.$ac_ext - if $ac_preproc_ok; then - : - else -- { { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check -+ { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check - See \`config.log' for more details." >&5 - $as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check - See \`config.log' for more details." >&2;} -- { (exit 1); exit 1; }; } -+ { (exit 1); exit 1; }; }; } - fi - - ac_ext=c - ac_cpp='$CPP $CPPFLAGS' - ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -@@ -3821,17 +3834,82 @@ else - MACARCH="current"; { $as_echo "$as_me:$LINENO: result: defaulting to $MACARCH" >&5 - $as_echo "defaulting to $MACARCH" >&6; } - fi - - -+ { $as_echo "$as_me:$LINENO: checking --with-developer-dir argument" >&5 -+$as_echo_n "checking --with-developer-dir argument... " >&6; } -+ -+# Check whether --with-developer-dir was given. -+if test "${with_developer_dir+set}" = set; then -+ withval=$with_developer_dir; DEVELOPER_DIR="$withval"; { $as_echo "$as_me:$LINENO: result: $DEVELOPER_DIR" >&5 -+$as_echo "$DEVELOPER_DIR" >&6; } -+else -+ DEVELOPER_DIR=""; { $as_echo "$as_me:$LINENO: result: not present" >&5 -+$as_echo "not present" >&6; } -+fi -+ -+ -+ if test "x$DEVELOPER_DIR" = "x"; then -+ # Extract the first word of "xcode-select", so it can be a program name with args. -+set dummy xcode-select; ac_word=$2 -+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -+$as_echo_n "checking for $ac_word... " >&6; } -+if test "${ac_cv_path_XCODE_SELECT+set}" = set; then -+ $as_echo_n "(cached) " >&6 -+else -+ case $XCODE_SELECT in -+ [\\/]* | ?:[\\/]*) -+ ac_cv_path_XCODE_SELECT="$XCODE_SELECT" # Let the user override the test with a path. -+ ;; -+ *) -+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ ac_cv_path_XCODE_SELECT="$as_dir/$ac_word$ac_exec_ext" -+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+done -+IFS=$as_save_IFS -+ -+ ;; -+esac -+fi -+XCODE_SELECT=$ac_cv_path_XCODE_SELECT -+if test -n "$XCODE_SELECT"; then -+ { $as_echo "$as_me:$LINENO: result: $XCODE_SELECT" >&5 -+$as_echo "$XCODE_SELECT" >&6; } -+else -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } -+fi -+ -+ -+ if test "x$XCODE_SELECT" != "x"; then -+ { $as_echo "$as_me:$LINENO: checking for developer dir using xcode-select" >&5 -+$as_echo_n "checking for developer dir using xcode-select... " >&6; } -+ DEVELOPER_DIR=`$XCODE_SELECT -print-path` -+ { $as_echo "$as_me:$LINENO: result: $DEVELOPER_DIR" >&5 -+$as_echo "$DEVELOPER_DIR" >&6; } -+ else -+ DEVELOPER_DIR=/Developer -+ fi -+ fi -+ - if test "x$MACARCH" = "xboth"; then - { $as_echo "$as_me:$LINENO: checking for 10.4 universal SDK" >&5 - $as_echo_n "checking for 10.4 universal SDK... " >&6; } - save_cppflags="$CPPFLAGS" - save_cflags="$CFLAGS" - save_ldflags="$LDFLAGS" -- CFLAGS="$CFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" -+ CFLAGS="$CFLAGS -isysroot $DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF - cat confdefs.h >>conftest.$ac_ext - cat >>conftest.$ac_ext <<_ACEOF -@@ -3948,13 +4026,13 @@ rm -f core conftest.err conftest.$ac_obj - MACOSX=yes - OS_EXTRA_SRC="os_macosx.c os_mac_conv.c"; - OS_EXTRA_OBJ="objects/os_macosx.o objects/os_mac_conv.o" - CPPFLAGS="$CPPFLAGS -DMACOS_X_UNIX -no-cpp-precomp" - if test "x$MACARCH" = "xboth"; then -- CPPFLAGS="$CPPFLAGS -I/Developer/SDKs/MacOSX10.4u.sdk/Developer/Headers/FlatCarbon" -+ CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk/Developer/Headers/FlatCarbon" - else -- CPPFLAGS="$CPPFLAGS -I/Developer/Headers/FlatCarbon" -+ CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/Headers/FlatCarbon" - fi - - # On IRIX 5.3, sys/types and inttypes.h are conflicting. - - -@@ -4014,12 +4092,13 @@ rm -f core conftest.err conftest.$ac_obj - fi - ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 - $as_echo "$ac_res" >&6; } --if test `eval 'as_val=${'$as_ac_Header'} -- $as_echo "$as_val"'` = yes; then -+as_val=`eval 'as_val=${'$as_ac_Header'} -+ $as_echo "$as_val"'` -+ if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF - #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 - _ACEOF - - fi -@@ -4152,11 +4231,11 @@ else - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_header_Carbon_Carbon_h" >&5 - $as_echo "$ac_cv_header_Carbon_Carbon_h" >&6; } - - fi --if test $ac_cv_header_Carbon_Carbon_h = yes; then -+if test "x$ac_cv_header_Carbon_Carbon_h" = x""yes; then - CARBON=yes - fi - - - if test "x$CARBON" = "xyes"; then -@@ -4482,11 +4561,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_selinux_is_selinux_enabled" >&5 - $as_echo "$ac_cv_lib_selinux_is_selinux_enabled" >&6; } --if test $ac_cv_lib_selinux_is_selinux_enabled = yes; then -+if test "x$ac_cv_lib_selinux_is_selinux_enabled" = x""yes; then - LIBS="$LIBS -lselinux" - cat >>confdefs.h <<\_ACEOF - #define HAVE_SELINUX 1 - _ACEOF - -@@ -4632,12 +4711,12 @@ $as_echo_n "checking PLTHOME environment - if test "X$PLTHOME" != "X"; then - { $as_echo "$as_me:$LINENO: result: \"$PLTHOME\"" >&5 - $as_echo "\"$PLTHOME\"" >&6; } - vi_cv_path_mzscheme_pfx="$PLTHOME" - else -- { $as_echo "$as_me:$LINENO: result: \"not set\"" >&5 --$as_echo "\"not set\"" >&6; } -+ { $as_echo "$as_me:$LINENO: result: not set" >&5 -+$as_echo "not set" >&6; } - # Extract the first word of "mzscheme", so it can be a program name with args. - set dummy mzscheme; ac_word=$2 - { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 - $as_echo_n "checking for $ac_word... " >&6; } - if test "${ac_cv_path_vi_cv_path_mzscheme+set}" = set; then -@@ -4688,66 +4767,90 @@ fi - { $as_echo "$as_me:$LINENO: checking MzScheme install prefix" >&5 - $as_echo_n "checking MzScheme install prefix... " >&6; } - if test "${vi_cv_path_mzscheme_pfx+set}" = set; then - $as_echo_n "(cached) " >&6 - else -- vi_cv_path_mzscheme_pfx=` -- ${vi_cv_path_mzscheme} -evm \ -- "(display (simplify-path \ -+ echo "(display (simplify-path \ - (build-path (call-with-values \ - (lambda () (split-path (find-system-path (quote exec-file)))) \ -- (lambda (base name must-be-dir?) base)) (quote up))))"` -+ (lambda (base name must-be-dir?) base)) (quote up))))" > mzdirs.scm -+ vi_cv_path_mzscheme_pfx=`${vi_cv_path_mzscheme} -r mzdirs.scm | \ -+ sed -e 's+/$++'` - fi - { $as_echo "$as_me:$LINENO: result: $vi_cv_path_mzscheme_pfx" >&5 - $as_echo "$vi_cv_path_mzscheme_pfx" >&6; } -- vi_cv_path_mzscheme_pfx=`echo "$vi_cv_path_mzscheme_pfx" | sed 's+/$++'` -+ rm -f mzdirs.scm - fi - fi - fi - - SCHEME_INC= - if test "X$vi_cv_path_mzscheme_pfx" != "X"; then - { $as_echo "$as_me:$LINENO: checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include" >&5 - $as_echo_n "checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include... " >&6; } - if test -f $vi_cv_path_mzscheme_pfx/include/scheme.h; then -- { $as_echo "$as_me:$LINENO: result: \"yes\"" >&5 --$as_echo "\"yes\"" >&6; } -+ SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include -+ { $as_echo "$as_me:$LINENO: result: yes" >&5 -+$as_echo "yes" >&6; } - else -- { $as_echo "$as_me:$LINENO: result: \"no\"" >&5 --$as_echo "\"no\"" >&6; } -- { $as_echo "$as_me:$LINENO: checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/plt/include" >&5 --$as_echo_n "checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/plt/include... " >&6; } -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } -+ { $as_echo "$as_me:$LINENO: checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include/plt" >&5 -+$as_echo_n "checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include/plt... " >&6; } - if test -f $vi_cv_path_mzscheme_pfx/include/plt/scheme.h; then -- { $as_echo "$as_me:$LINENO: result: \"yes\"" >&5 --$as_echo "\"yes\"" >&6; } -- SCHEME_INC=/plt -+ { $as_echo "$as_me:$LINENO: result: yes" >&5 -+$as_echo "yes" >&6; } -+ SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include/plt - else -- { $as_echo "$as_me:$LINENO: result: \"no\"" >&5 --$as_echo "\"no\"" >&6; } -- vi_cv_path_mzscheme_pfx= -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } -+ { $as_echo "$as_me:$LINENO: checking if scheme.h can be found in /usr/include/plt/" >&5 -+$as_echo_n "checking if scheme.h can be found in /usr/include/plt/... " >&6; } -+ if test -f /usr/include/plt/scheme.h; then -+ { $as_echo "$as_me:$LINENO: result: yes" >&5 -+$as_echo "yes" >&6; } -+ SCHEME_INC=/usr/include/plt -+ else -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } -+ vi_cv_path_mzscheme_pfx= -+ fi - fi - fi - fi - - if test "X$vi_cv_path_mzscheme_pfx" != "X"; then - if test "x$MACOSX" = "xyes"; then - MZSCHEME_LIBS="-framework PLT_MzScheme" -+ elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"; then -+ MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a" -+ MZSCHEME_CFLAGS="-DMZ_PRECISE_GC" - elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"; then - MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a" - else -- MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc" -+ if test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.so"; then -+ MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme3m" -+ MZSCHEME_CFLAGS="-DMZ_PRECISE_GC" -+ else -+ MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc" -+ fi - if test "$GCC" = yes; then -- MZSCHEME_LIBS="$MZSCHEME_LIBS -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib" -+ MZSCHEME_LIBS="${MZSCHEME_LIBS} -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib" - elif test "`(uname) 2>/dev/null`" = SunOS && - uname -r | grep '^5' >/dev/null; then -- MZSCHEME_LIBS="$MZSCHEME_LIBS -R ${vi_cv_path_mzscheme_pfx}/lib" -+ MZSCHEME_LIBS="${MZSCHEME_LIBS} -R ${vi_cv_path_mzscheme_pfx}/lib" - fi - fi - if test -d $vi_cv_path_mzscheme_pfx/lib/plt/collects; then - SCHEME_COLLECTS=lib/plt/ - fi -- MZSCHEME_CFLAGS="-I${vi_cv_path_mzscheme_pfx}/include${SCHEME_INC} \ -+ if test -f "${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects/scheme/base.ss" ; then -+ MZSCHEME_EXTRA="mzscheme_base.c" -+ MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -DINCLUDE_MZSCHEME_BASE" -+ MZSCHEME_MZC="${vi_cv_path_mzscheme_pfx}/bin/mzc" -+ fi -+ MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -I${SCHEME_INC} \ - -DMZSCHEME_COLLECTS='\"${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects\"'" - MZSCHEME_SRC="if_mzsch.c" - MZSCHEME_OBJ="objects/if_mzsch.o" - MZSCHEME_PRO="if_mzsch.pro" - cat >>confdefs.h <<\_ACEOF -@@ -4758,10 +4861,12 @@ _ACEOF - - - - - -+ -+ - fi - - - { $as_echo "$as_me:$LINENO: checking --enable-perlinterp argument" >&5 - $as_echo_n "checking --enable-perlinterp argument... " >&6; } -@@ -5089,11 +5194,11 @@ if test "${vi_cv_path_python_conf+set}" - $as_echo_n "(cached) " >&6 - else - - vi_cv_path_python_conf= - for path in "${vi_cv_path_python_pfx}" "${vi_cv_path_python_epfx}"; do -- for subdir in lib share; do -+ for subdir in lib64 lib share; do - d="${path}/${subdir}/python${vi_cv_var_python_version}/config" - if test -d "$d" && test -f "$d/config.c"; then - vi_cv_path_python_conf="$d" - fi - done -@@ -5666,13 +5771,25 @@ else - fi - - { $as_echo "$as_me:$LINENO: result: $enable_rubyinterp" >&5 - $as_echo "$enable_rubyinterp" >&6; } - if test "$enable_rubyinterp" = "yes"; then -+ { $as_echo "$as_me:$LINENO: checking --with-ruby-command argument" >&5 -+$as_echo_n "checking --with-ruby-command argument... " >&6; } -+ -+# Check whether --with-ruby-command was given. -+if test "${with_ruby_command+set}" = set; then -+ withval=$with_ruby_command; RUBY_CMD="$withval"; { $as_echo "$as_me:$LINENO: result: $RUBY_CMD" >&5 -+$as_echo "$RUBY_CMD" >&6; } -+else -+ RUBY_CMD="ruby"; { $as_echo "$as_me:$LINENO: result: defaulting to $RUBY_CMD" >&5 -+$as_echo "defaulting to $RUBY_CMD" >&6; } -+fi - -- # Extract the first word of "ruby", so it can be a program name with args. --set dummy ruby; ac_word=$2 -+ -+ # Extract the first word of "$RUBY_CMD", so it can be a program name with args. -+set dummy $RUBY_CMD; ac_word=$2 - { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 - $as_echo_n "checking for $ac_word... " >&6; } - if test "${ac_cv_path_vi_cv_path_ruby+set}" = set; then - $as_echo_n "(cached) " >&6 - else -@@ -5715,15 +5832,21 @@ $as_echo_n "checking Ruby version... " > - if $vi_cv_path_ruby -e '(VERSION rescue RUBY_VERSION) >= "1.6.0" or exit 1' >/dev/null 2>/dev/null; then - { $as_echo "$as_me:$LINENO: result: OK" >&5 - $as_echo "OK" >&6; } - { $as_echo "$as_me:$LINENO: checking Ruby header files" >&5 - $as_echo_n "checking Ruby header files... " >&6; } -- rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG["archdir"] || $hdrdir' 2>/dev/null` -+ rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG["rubyhdrdir"] || Config::CONFIG["archdir"] || $hdrdir' 2>/dev/null` - if test "X$rubyhdrdir" != "X"; then - { $as_echo "$as_me:$LINENO: result: $rubyhdrdir" >&5 - $as_echo "$rubyhdrdir" >&6; } - RUBY_CFLAGS="-I$rubyhdrdir" -+ rubyarch=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG["arch"]'` -+ if test -d "$rubyhdrdir/$rubyarch"; then -+ RUBY_CFLAGS="$RUBY_CFLAGS -I$rubyhdrdir/$rubyarch" -+ fi -+ rubyversion=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG["ruby_version"].gsub(/\./, "")[0,2]'` -+ RUBY_CFLAGS="$RUBY_CFLAGS -DRUBY_VERSION=$rubyversion" - rubylibs=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG["LIBS"]'` - if test "X$rubylibs" != "X"; then - RUBY_LIBS="$rubylibs" - fi - librubyarg=`$vi_cv_path_ruby -r rbconfig -e 'print Config.expand(Config::CONFIG["LIBRUBYARG"])'` -@@ -5743,22 +5866,25 @@ $as_echo "$rubyhdrdir" >&6; } - if test "X$librubyarg" != "X"; then - RUBY_LIBS="$librubyarg $RUBY_LIBS" - fi - rubyldflags=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG["LDFLAGS"]'` - if test "X$rubyldflags" != "X"; then -- LDFLAGS="$rubyldflags $LDFLAGS" -+ rubyldflags=`echo "$rubyldflags" | sed -e 's/-arch\ ppc//' -e 's/-arch\ i386//'` -+ if test "X$rubyldflags" != "X"; then -+ LDFLAGS="$rubyldflags $LDFLAGS" -+ fi - fi - RUBY_SRC="if_ruby.c" - RUBY_OBJ="objects/if_ruby.o" - RUBY_PRO="if_ruby.pro" - cat >>confdefs.h <<\_ACEOF - #define FEAT_RUBY 1 - _ACEOF - - else -- { $as_echo "$as_me:$LINENO: result: not found" >&5 --$as_echo "not found" >&6; } -+ { $as_echo "$as_me:$LINENO: result: not found; disabling Ruby" >&5 -+$as_echo "not found; disabling Ruby" >&6; } - fi - else - { $as_echo "$as_me:$LINENO: result: too old; need Ruby version 1.6.0 or later" >&5 - $as_echo "too old; need Ruby version 1.6.0 or later" >&6; } - fi -@@ -5889,11 +6015,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_socket_socket" >&5 - $as_echo "$ac_cv_lib_socket_socket" >&6; } --if test $ac_cv_lib_socket_socket = yes; then -+if test "x$ac_cv_lib_socket_socket" = x""yes; then - cat >>confdefs.h <<_ACEOF - #define HAVE_LIBSOCKET 1 - _ACEOF - - LIBS="-lsocket $LIBS" -@@ -5964,11 +6090,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5 - $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } --if test $ac_cv_lib_nsl_gethostbyname = yes; then -+if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then - cat >>confdefs.h <<_ACEOF - #define HAVE_LIBNSL 1 - _ACEOF - - LIBS="-lnsl $LIBS" -@@ -6201,12 +6327,12 @@ fi - if test "x$with_x" = xno; then - # The user explicitly disabled X. - have_x=disabled - else - case $x_includes,$x_libraries in #( -- *\'*) { { $as_echo "$as_me:$LINENO: error: Cannot use X directory names containing '" >&5 --$as_echo "$as_me: error: Cannot use X directory names containing '" >&2;} -+ *\'*) { { $as_echo "$as_me:$LINENO: error: cannot use X directory names containing '" >&5 -+$as_echo "$as_me: error: cannot use X directory names containing '" >&2;} - { (exit 1); exit 1; }; };; #( - *,NONE | NONE,*) if test "${ac_cv_have_x+set}" = set; then - $as_echo_n "(cached) " >&6 - else - # One or both of the vars are not set, and there is no cached value. -@@ -6240,11 +6366,11 @@ _ACEOF - case $ac_im_incroot in - /usr/include) ac_x_includes= ;; - *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; - esac - case $ac_im_usrlibdir in -- /usr/lib | /lib) ;; -+ /usr/lib | /usr/lib64 | /lib | /lib64) ;; - *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; - esac - fi - cd .. - rm -f -r conftest.dir -@@ -6680,11 +6806,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 - $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } --if test $ac_cv_lib_dnet_dnet_ntoa = yes; then -+if test "x$ac_cv_lib_dnet_dnet_ntoa" = x""yes; then - X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" - fi - - if test $ac_cv_lib_dnet_dnet_ntoa = no; then - { $as_echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet_stub" >&5 -@@ -6750,11 +6876,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 - $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } --if test $ac_cv_lib_dnet_stub_dnet_ntoa = yes; then -+if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = x""yes; then - X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" - fi - - fi - fi -@@ -6922,11 +7048,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5 - $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } --if test $ac_cv_lib_nsl_gethostbyname = yes; then -+if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then - X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" - fi - - if test $ac_cv_lib_nsl_gethostbyname = no; then - { $as_echo "$as_me:$LINENO: checking for gethostbyname in -lbsd" >&5 -@@ -6992,11 +7118,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gethostbyname" >&5 - $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } --if test $ac_cv_lib_bsd_gethostbyname = yes; then -+if test "x$ac_cv_lib_bsd_gethostbyname" = x""yes; then - X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" - fi - - fi - fi -@@ -7158,11 +7284,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5 - $as_echo "$ac_cv_lib_socket_connect" >&6; } --if test $ac_cv_lib_socket_connect = yes; then -+if test "x$ac_cv_lib_socket_connect" = x""yes; then - X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" - fi - - fi - -@@ -7317,11 +7443,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_posix_remove" >&5 - $as_echo "$ac_cv_lib_posix_remove" >&6; } --if test $ac_cv_lib_posix_remove = yes; then -+if test "x$ac_cv_lib_posix_remove" = x""yes; then - X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" - fi - - fi - -@@ -7476,11 +7602,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_ipc_shmat" >&5 - $as_echo "$ac_cv_lib_ipc_shmat" >&6; } --if test $ac_cv_lib_ipc_shmat = yes; then -+if test "x$ac_cv_lib_ipc_shmat" = x""yes; then - X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" - fi - - fi - fi -@@ -7557,11 +7683,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 - $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } --if test $ac_cv_lib_ICE_IceConnectionNumber = yes; then -+if test "x$ac_cv_lib_ICE_IceConnectionNumber" = x""yes; then - X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" - fi - - LDFLAGS=$ac_save_LDFLAGS - -@@ -7725,11 +7851,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_Xdmcp__XdmcpAuthDoIt" >&5 - $as_echo "$ac_cv_lib_Xdmcp__XdmcpAuthDoIt" >&6; } --if test $ac_cv_lib_Xdmcp__XdmcpAuthDoIt = yes; then -+if test "x$ac_cv_lib_Xdmcp__XdmcpAuthDoIt" = x""yes; then - X_EXTRA_LIBS="$X_EXTRA_LIBS -lXdmcp" - fi - - - { $as_echo "$as_me:$LINENO: checking for IceOpenConnection in -lICE" >&5 -@@ -7795,11 +7921,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceOpenConnection" >&5 - $as_echo "$ac_cv_lib_ICE_IceOpenConnection" >&6; } --if test $ac_cv_lib_ICE_IceOpenConnection = yes; then -+if test "x$ac_cv_lib_ICE_IceOpenConnection" = x""yes; then - X_EXTRA_LIBS="$X_EXTRA_LIBS -lSM -lICE" - fi - - - LDFLAGS="$X_LIBS $ac_save_LDFLAGS" -@@ -7866,11 +7992,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_Xpm_XpmCreatePixmapFromData" >&5 - $as_echo "$ac_cv_lib_Xpm_XpmCreatePixmapFromData" >&6; } --if test $ac_cv_lib_Xpm_XpmCreatePixmapFromData = yes; then -+if test "x$ac_cv_lib_Xpm_XpmCreatePixmapFromData" = x""yes; then - X_PRE_LIBS="$X_PRE_LIBS -lXpm" - fi - - - { $as_echo "$as_me:$LINENO: checking if X11 header files implicitly declare return values" >&5 -@@ -7968,10 +8094,86 @@ fi - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - CFLAGS=$cflags_save - - LDFLAGS="$ac_save_LDFLAGS" - -+ { $as_echo "$as_me:$LINENO: checking size of wchar_t is 2 bytes" >&5 -+$as_echo_n "checking size of wchar_t is 2 bytes... " >&6; } -+ if test "${ac_cv_small_wchar_t+set}" = set; then -+ $as_echo_n "(cached) " >&6 -+else -+ if test "$cross_compiling" = yes; then -+ { { $as_echo "$as_me:$LINENO: error: failed to compile test program" >&5 -+$as_echo "$as_me: error: failed to compile test program" >&2;} -+ { (exit 1); exit 1; }; } -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+#include <X11/Xlib.h> -+#if STDC_HEADERS -+# include <stdlib.h> -+# include <stddef.h> -+#endif -+ main() -+ { -+ if (sizeof(wchar_t) <= 2) -+ exit(1); -+ exit(0); -+ } -+_ACEOF -+rm -f conftest$ac_exeext -+if { (ac_try="$ac_link" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>&5 -+ ac_status=$? -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext' -+ { (case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_try") 2>&5 -+ ac_status=$? -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); }; }; then -+ ac_cv_small_wchar_t="no" -+else -+ $as_echo "$as_me: program exited with status $ac_status" >&5 -+$as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+( exit $ac_status ) -+ac_cv_small_wchar_t="yes" -+fi -+rm -rf conftest.dSYM -+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -+fi -+ -+ -+fi -+ -+ { $as_echo "$as_me:$LINENO: result: $ac_cv_small_wchar_t" >&5 -+$as_echo "$ac_cv_small_wchar_t" >&6; } -+ if test "x$ac_cv_small_wchar_t" = "xyes" ; then -+ cat >>confdefs.h <<\_ACEOF -+#define SMALL_WCHAR_T 1 -+_ACEOF -+ -+ fi -+ - fi - fi - - test "x$with_x" = xno -a "x$MACOSX" != "xyes" -a "x$QNX" != "xyes" && enable_gui=no - -@@ -9249,11 +9451,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_Xext_XShapeQueryExtension" >&5 - $as_echo "$ac_cv_lib_Xext_XShapeQueryExtension" >&6; } --if test $ac_cv_lib_Xext_XShapeQueryExtension = yes; then -+if test "x$ac_cv_lib_Xext_XShapeQueryExtension" = x""yes; then - GUI_X_LIBS="-lXext" - fi - - { $as_echo "$as_me:$LINENO: checking for wslen in -lw" >&5 - $as_echo_n "checking for wslen in -lw... " >&6; } -@@ -9318,11 +9520,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_w_wslen" >&5 - $as_echo "$ac_cv_lib_w_wslen" >&6; } --if test $ac_cv_lib_w_wslen = yes; then -+if test "x$ac_cv_lib_w_wslen" = x""yes; then - X_EXTRA_LIBS="$X_EXTRA_LIBS -lw" - fi - - { $as_echo "$as_me:$LINENO: checking for dlsym in -ldl" >&5 - $as_echo_n "checking for dlsym in -ldl... " >&6; } -@@ -9387,11 +9589,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlsym" >&5 - $as_echo "$ac_cv_lib_dl_dlsym" >&6; } --if test $ac_cv_lib_dl_dlsym = yes; then -+if test "x$ac_cv_lib_dl_dlsym" = x""yes; then - X_EXTRA_LIBS="$X_EXTRA_LIBS -ldl" - fi - - { $as_echo "$as_me:$LINENO: checking for XmuCreateStippledPixmap in -lXmu" >&5 - $as_echo_n "checking for XmuCreateStippledPixmap in -lXmu... " >&6; } -@@ -9456,11 +9658,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_Xmu_XmuCreateStippledPixmap" >&5 - $as_echo "$ac_cv_lib_Xmu_XmuCreateStippledPixmap" >&6; } --if test $ac_cv_lib_Xmu_XmuCreateStippledPixmap = yes; then -+if test "x$ac_cv_lib_Xmu_XmuCreateStippledPixmap" = x""yes; then - GUI_X_LIBS="-lXmu $GUI_X_LIBS" - fi - - if test -z "$SKIP_MOTIF"; then - { $as_echo "$as_me:$LINENO: checking for XpEndJob in -lXp" >&5 -@@ -9526,11 +9728,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_Xp_XpEndJob" >&5 - $as_echo "$ac_cv_lib_Xp_XpEndJob" >&6; } --if test $ac_cv_lib_Xp_XpEndJob = yes; then -+if test "x$ac_cv_lib_Xp_XpEndJob" = x""yes; then - GUI_X_LIBS="-lXp $GUI_X_LIBS" - fi - - fi - LDFLAGS=$ldflags_save -@@ -9697,12 +9899,13 @@ ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 - $as_echo "$ac_res" >&6; } - - fi --if test `eval 'as_val=${'$as_ac_Header'} -- $as_echo "$as_val"'` = yes; then -+as_val=`eval 'as_val=${'$as_ac_Header'} -+ $as_echo "$as_val"'` -+ if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF - #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 - _ACEOF - - fi -@@ -9850,12 +10053,13 @@ ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 - $as_echo "$ac_res" >&6; } - - fi --if test `eval 'as_val=${'$as_ac_Header'} -- $as_echo "$as_val"'` = yes; then -+as_val=`eval 'as_val=${'$as_ac_Header'} -+ $as_echo "$as_val"'` -+ if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF - #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 - _ACEOF - - fi -@@ -10096,12 +10300,13 @@ ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 - $as_echo "$ac_res" >&6; } - - fi --if test `eval 'as_val=${'$as_ac_Header'} -- $as_echo "$as_val"'` = yes; then -+as_val=`eval 'as_val=${'$as_ac_Header'} -+ $as_echo "$as_val"'` -+ if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF - #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 - _ACEOF - - fi -@@ -10360,10 +10565,60 @@ sed 's/^/| /' conftest.$ac_ext >&5 - $as_echo "no" >&6; } - fi - - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -+{ $as_echo "$as_me:$LINENO: checking whether __attribute__((unused)) is allowed" >&5 -+$as_echo_n "checking whether __attribute__((unused)) is allowed... " >&6; } -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include <stdio.h> -+int -+main () -+{ -+int x __attribute__((unused)); -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (ac_try="$ac_compile" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ { $as_echo "$as_me:$LINENO: result: yes" >&5 -+$as_echo "yes" >&6; }; cat >>confdefs.h <<\_ACEOF -+#define HAVE_ATTRIBUTE_UNUSED 1 -+_ACEOF -+ -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+ - if test "${ac_cv_header_elf_h+set}" = set; then - { $as_echo "$as_me:$LINENO: checking for elf.h" >&5 - $as_echo_n "checking for elf.h... " >&6; } - if test "${ac_cv_header_elf_h+set}" = set; then - $as_echo_n "(cached) " >&6 -@@ -10487,11 +10742,11 @@ else - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_header_elf_h" >&5 - $as_echo "$ac_cv_header_elf_h" >&6; } - - fi --if test $ac_cv_header_elf_h = yes; then -+if test "x$ac_cv_header_elf_h" = x""yes; then - HAS_ELF=1 - fi - - - if test "$HAS_ELF" = 1; then -@@ -10553,11 +10808,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_elf_main" >&5 - $as_echo "$ac_cv_lib_elf_main" >&6; } --if test $ac_cv_lib_elf_main = yes; then -+if test "x$ac_cv_lib_elf_main" = x""yes; then - cat >>confdefs.h <<_ACEOF - #define HAVE_LIBELF 1 - _ACEOF - - LIBS="-lelf $LIBS" -@@ -10627,12 +10882,13 @@ rm -f core conftest.err conftest.$ac_obj - fi - ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 - $as_echo "$ac_res" >&6; } --if test `eval 'as_val=${'$as_ac_Header'} -- $as_echo "$as_val"'` = yes; then -+as_val=`eval 'as_val=${'$as_ac_Header'} -+ $as_echo "$as_val"'` -+ if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF - #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 - _ACEOF - - ac_header_dirent=$ac_hdr; break -@@ -10914,19 +11170,18 @@ fi - - - - - -- - for ac_header in stdarg.h stdlib.h string.h sys/select.h sys/utsname.h \ - termcap.h fcntl.h sgtty.h sys/ioctl.h sys/time.h sys/types.h termio.h \ - iconv.h langinfo.h math.h unistd.h stropts.h errno.h \ - sys/resource.h sys/systeminfo.h locale.h \ - sys/stream.h termios.h libc.h sys/statfs.h \ - poll.h sys/poll.h pwd.h utime.h sys/param.h libintl.h \ - libgen.h util/debug.h util/msg18n.h frame.h \ -- sys/acl.h sys/access.h sys/sysctl.h sys/sysinfo.h wchar.h wctype.h -+ sys/acl.h sys/access.h sys/sysinfo.h wchar.h wctype.h - do - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` - if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 - $as_echo_n "checking for $ac_header... " >&6; } -@@ -11048,31 +11303,97 @@ esac - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 - $as_echo_n "checking for $ac_header... " >&6; } - if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 - else -- eval "$as_ac_Header=\$ac_header_preproc" -+ eval "$as_ac_Header=\$ac_header_preproc" -+fi -+ac_res=`eval 'as_val=${'$as_ac_Header'} -+ $as_echo "$as_val"'` -+ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -+$as_echo "$ac_res" >&6; } -+ -+fi -+as_val=`eval 'as_val=${'$as_ac_Header'} -+ $as_echo "$as_val"'` -+ if test "x$as_val" = x""yes; then -+ cat >>confdefs.h <<_ACEOF -+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -+_ACEOF -+ -+fi -+ -+done -+ -+ -+ -+for ac_header in sys/ptem.h -+do -+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -+$as_echo_n "checking for $ac_header... " >&6; } -+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then -+ $as_echo_n "(cached) " >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#if defined HAVE_SYS_STREAM_H -+# include <sys/stream.h> -+#endif -+ -+#include <$ac_header> -+_ACEOF -+rm -f conftest.$ac_objext -+if { (ac_try="$ac_compile" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ eval "$as_ac_Header=yes" -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ eval "$as_ac_Header=no" -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi - ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 - $as_echo "$ac_res" >&6; } -- --fi --if test `eval 'as_val=${'$as_ac_Header'} -- $as_echo "$as_val"'` = yes; then -+as_val=`eval 'as_val=${'$as_ac_Header'} -+ $as_echo "$as_val"'` -+ if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF - #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 - _ACEOF - - fi - - done - - - --for ac_header in sys/ptem.h -+for ac_header in sys/sysctl.h - do - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` - { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 - $as_echo_n "checking for $ac_header... " >&6; } - if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then -@@ -11082,12 +11403,12 @@ else - /* confdefs.h. */ - _ACEOF - cat confdefs.h >>conftest.$ac_ext - cat >>conftest.$ac_ext <<_ACEOF - /* end confdefs.h. */ --#if defined HAVE_SYS_STREAM_H --# include <sys/stream.h> -+#if defined HAVE_SYS_PARAM_H -+# include <sys/param.h> - #endif - - #include <$ac_header> - _ACEOF - rm -f conftest.$ac_objext -@@ -11120,12 +11441,13 @@ rm -f core conftest.err conftest.$ac_obj - fi - ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 - $as_echo "$ac_res" >&6; } --if test `eval 'as_val=${'$as_ac_Header'} -- $as_echo "$as_val"'` = yes; then -+as_val=`eval 'as_val=${'$as_ac_Header'} -+ $as_echo "$as_val"'` -+ if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF - #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 - _ACEOF - - fi -@@ -11320,12 +11642,13 @@ ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 - $as_echo "$ac_res" >&6; } - - fi --if test `eval 'as_val=${'$as_ac_Header'} -- $as_echo "$as_val"'` = yes; then -+as_val=`eval 'as_val=${'$as_ac_Header'} -+ $as_echo "$as_val"'` -+ if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF - #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 - _ACEOF - - fi -@@ -11563,10 +11886,71 @@ cat >>confdefs.h <<\_ACEOF - #define const /**/ - _ACEOF - - fi - -+{ $as_echo "$as_me:$LINENO: checking for working volatile" >&5 -+$as_echo_n "checking for working volatile... " >&6; } -+if test "${ac_cv_c_volatile+set}" = set; then -+ $as_echo_n "(cached) " >&6 -+else -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+volatile int x; -+int * volatile y = (int *) 0; -+return !x && !y; -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (ac_try="$ac_compile" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ ac_cv_c_volatile=yes -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ ac_cv_c_volatile=no -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_volatile" >&5 -+$as_echo "$ac_cv_c_volatile" >&6; } -+if test $ac_cv_c_volatile = no; then -+ -+cat >>confdefs.h <<\_ACEOF -+#define volatile /**/ -+_ACEOF -+ -+fi -+ - { $as_echo "$as_me:$LINENO: checking for mode_t" >&5 - $as_echo_n "checking for mode_t... " >&6; } - if test "${ac_cv_type_mode_t+set}" = set; then - $as_echo_n "(cached) " >&6 - else -@@ -11657,11 +12041,11 @@ fi - - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_type_mode_t" >&5 - $as_echo "$ac_cv_type_mode_t" >&6; } --if test $ac_cv_type_mode_t = yes; then -+if test "x$ac_cv_type_mode_t" = x""yes; then - : - else - - cat >>confdefs.h <<_ACEOF - #define mode_t int -@@ -11761,11 +12145,11 @@ fi - - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5 - $as_echo "$ac_cv_type_off_t" >&6; } --if test $ac_cv_type_off_t = yes; then -+if test "x$ac_cv_type_off_t" = x""yes; then - : - else - - cat >>confdefs.h <<_ACEOF - #define off_t long int -@@ -11865,11 +12249,11 @@ fi - - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5 - $as_echo "$ac_cv_type_pid_t" >&6; } --if test $ac_cv_type_pid_t = yes; then -+if test "x$ac_cv_type_pid_t" = x""yes; then - : - else - - cat >>confdefs.h <<_ACEOF - #define pid_t int -@@ -11969,11 +12353,11 @@ fi - - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 - $as_echo "$ac_cv_type_size_t" >&6; } --if test $ac_cv_type_size_t = yes; then -+if test "x$ac_cv_type_size_t" = x""yes; then - : - else - - cat >>confdefs.h <<_ACEOF - #define size_t unsigned int -@@ -12173,11 +12557,11 @@ fi - - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_type_ino_t" >&5 - $as_echo "$ac_cv_type_ino_t" >&6; } --if test $ac_cv_type_ino_t = yes; then -+if test "x$ac_cv_type_ino_t" = x""yes; then - : - else - - cat >>confdefs.h <<_ACEOF - #define ino_t long -@@ -12277,11 +12661,11 @@ fi - - rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_type_dev_t" >&5 - $as_echo "$ac_cv_type_dev_t" >&6; } --if test $ac_cv_type_dev_t = yes; then -+if test "x$ac_cv_type_dev_t" = x""yes; then - : - else - - cat >>confdefs.h <<_ACEOF - #define dev_t unsigned -@@ -12567,12 +12951,13 @@ LIBS=$ac_check_lib_save_LIBS - fi - ac_res=`eval 'as_val=${'$as_ac_Lib'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 - $as_echo "$ac_res" >&6; } --if test `eval 'as_val=${'$as_ac_Lib'} -- $as_echo "$as_val"'` = yes; then -+as_val=`eval 'as_val=${'$as_ac_Lib'} -+ $as_echo "$as_val"'` -+ if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF - #define `$as_echo "HAVE_LIB${libname}" | $as_tr_cpp` 1 - _ACEOF - - LIBS="-l${libname} $LIBS" -@@ -13419,24 +13804,24 @@ $as_echo "$ac_try_echo") >&5 - fi - { $as_echo "$as_me:$LINENO: result: pty mode: $vim_cv_tty_mode, group: $vim_cv_tty_group" >&5 - $as_echo "pty mode: $vim_cv_tty_mode, group: $vim_cv_tty_group" >&6; } - else - vim_cv_tty_group=world -- { $as_echo "$as_me:$LINENO: result: ptys are world accessable" >&5 --$as_echo "ptys are world accessable" >&6; } -+ { $as_echo "$as_me:$LINENO: result: ptys are world accessible" >&5 -+$as_echo "ptys are world accessible" >&6; } - fi - - else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 - sed 's/^/| /' conftest.$ac_ext >&5 - - ( exit $ac_status ) - - vim_cv_tty_group=world -- { $as_echo "$as_me:$LINENO: result: can't determine - assume ptys are world accessable" >&5 --$as_echo "can't determine - assume ptys are world accessable" >&6; } -+ { $as_echo "$as_me:$LINENO: result: can't determine - assume ptys are world accessible" >&5 -+$as_echo "can't determine - assume ptys are world accessible" >&6; } - - fi - rm -rf conftest.dSYM - rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext - fi -@@ -13719,14 +14104,13 @@ fi - - - - - -- --for ac_func in bcmp fchdir fchown fseeko fsync ftello getcwd getpseudotty \ -+for ac_func in bcmp fchdir fchown fsync getcwd getpseudotty \ - getpwnam getpwuid getrlimit gettimeofday getwd lstat memcmp \ -- memset nanosleep opendir putenv qsort readlink select setenv \ -+ memset mkdtemp nanosleep opendir putenv qsort readlink select setenv \ - setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction \ - sigvec strcasecmp strerror strftime stricmp strncasecmp \ - strnicmp strpbrk strtol tgetent towlower towupper iswupper \ - usleep utime utimes - do -@@ -13816,19 +14200,152 @@ rm -f core conftest.err conftest.$ac_obj - fi - ac_res=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 - $as_echo "$ac_res" >&6; } --if test `eval 'as_val=${'$as_ac_var'} -- $as_echo "$as_val"'` = yes; then -+as_val=`eval 'as_val=${'$as_ac_var'} -+ $as_echo "$as_val"'` -+ if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF - #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 - _ACEOF - - fi - done - -+{ $as_echo "$as_me:$LINENO: checking for _LARGEFILE_SOURCE value needed for large files" >&5 -+$as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; } -+if test "${ac_cv_sys_largefile_source+set}" = set; then -+ $as_echo_n "(cached) " >&6 -+else -+ while :; do -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#include <sys/types.h> /* for off_t */ -+ #include <stdio.h> -+int -+main () -+{ -+int (*fp) (FILE *, off_t, int) = fseeko; -+ return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (ac_try="$ac_link" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest$ac_exeext && { -+ test "$cross_compiling" = yes || -+ $as_test_x conftest$ac_exeext -+ }; then -+ ac_cv_sys_largefile_source=no; break -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ -+fi -+ -+rm -rf conftest.dSYM -+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ -+ conftest$ac_exeext conftest.$ac_ext -+ cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#define _LARGEFILE_SOURCE 1 -+#include <sys/types.h> /* for off_t */ -+ #include <stdio.h> -+int -+main () -+{ -+int (*fp) (FILE *, off_t, int) = fseeko; -+ return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext conftest$ac_exeext -+if { (ac_try="$ac_link" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_link") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest$ac_exeext && { -+ test "$cross_compiling" = yes || -+ $as_test_x conftest$ac_exeext -+ }; then -+ ac_cv_sys_largefile_source=1; break -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ -+fi -+ -+rm -rf conftest.dSYM -+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ -+ conftest$ac_exeext conftest.$ac_ext -+ ac_cv_sys_largefile_source=unknown -+ break -+done -+fi -+{ $as_echo "$as_me:$LINENO: result: $ac_cv_sys_largefile_source" >&5 -+$as_echo "$ac_cv_sys_largefile_source" >&6; } -+case $ac_cv_sys_largefile_source in #( -+ no | unknown) ;; -+ *) -+cat >>confdefs.h <<_ACEOF -+#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source -+_ACEOF -+;; -+esac -+rm -rf conftest* -+ -+# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug -+# in glibc 2.1.3, but that breaks too many other things. -+# If you want fseeko and ftello with glibc, upgrade to a fixed glibc. -+if test $ac_cv_sys_largefile_source != unknown; then -+ -+cat >>confdefs.h <<\_ACEOF -+#define HAVE_FSEEKO 1 -+_ACEOF -+ -+fi -+ - - { $as_echo "$as_me:$LINENO: checking for st_blksize" >&5 - $as_echo_n "checking for st_blksize... " >&6; } - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ -@@ -14200,11 +14717,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_m_strtod" >&5 - $as_echo "$ac_cv_lib_m_strtod" >&6; } --if test $ac_cv_lib_m_strtod = yes; then -+if test "x$ac_cv_lib_m_strtod" = x""yes; then - cat >>confdefs.h <<_ACEOF - #define HAVE_LIBM 1 - _ACEOF - - LIBS="-lm $LIBS" -@@ -14360,11 +14877,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_posix1e_acl_get_file" >&5 - $as_echo "$ac_cv_lib_posix1e_acl_get_file" >&6; } --if test $ac_cv_lib_posix1e_acl_get_file = yes; then -+if test "x$ac_cv_lib_posix1e_acl_get_file" = x""yes; then - LIBS="$LIBS -lposix1e" - else - { $as_echo "$as_me:$LINENO: checking for acl_get_file in -lacl" >&5 - $as_echo_n "checking for acl_get_file in -lacl... " >&6; } - if test "${ac_cv_lib_acl_acl_get_file+set}" = set; then -@@ -14428,11 +14945,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_acl_acl_get_file" >&5 - $as_echo "$ac_cv_lib_acl_acl_get_file" >&6; } --if test $ac_cv_lib_acl_acl_get_file = yes; then -+if test "x$ac_cv_lib_acl_acl_get_file" = x""yes; then - LIBS="$LIBS -lacl" - { $as_echo "$as_me:$LINENO: checking for fgetxattr in -lattr" >&5 - $as_echo_n "checking for fgetxattr in -lattr... " >&6; } - if test "${ac_cv_lib_attr_fgetxattr+set}" = set; then - $as_echo_n "(cached) " >&6 -@@ -14495,11 +15012,11 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_attr_fgetxattr" >&5 - $as_echo "$ac_cv_lib_attr_fgetxattr" >&6; } --if test $ac_cv_lib_attr_fgetxattr = yes; then -+if test "x$ac_cv_lib_attr_fgetxattr" = x""yes; then - LIBS="$LIBS -lattr" - fi - - fi - -@@ -14873,10 +15390,62 @@ _ACEOF - else - { $as_echo "$as_me:$LINENO: result: yes" >&5 - $as_echo "yes" >&6; } - fi - -+{ $as_echo "$as_me:$LINENO: checking for FD_CLOEXEC" >&5 -+$as_echo_n "checking for FD_CLOEXEC... " >&6; } -+cat >conftest.$ac_ext <<_ACEOF -+/* confdefs.h. */ -+_ACEOF -+cat confdefs.h >>conftest.$ac_ext -+cat >>conftest.$ac_ext <<_ACEOF -+/* end confdefs.h. */ -+#if HAVE_FCNTL_H -+# include <fcntl.h> -+#endif -+int -+main () -+{ -+ int flag = FD_CLOEXEC; -+ ; -+ return 0; -+} -+_ACEOF -+rm -f conftest.$ac_objext -+if { (ac_try="$ac_compile" -+case "(($ac_try" in -+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; -+ *) ac_try_echo=$ac_try;; -+esac -+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -+$as_echo "$ac_try_echo") >&5 -+ (eval "$ac_compile") 2>conftest.er1 -+ ac_status=$? -+ grep -v '^ *+' conftest.er1 >conftest.err -+ rm -f conftest.er1 -+ cat conftest.err >&5 -+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 -+ (exit $ac_status); } && { -+ test -z "$ac_c_werror_flag" || -+ test ! -s conftest.err -+ } && test -s conftest.$ac_objext; then -+ { $as_echo "$as_me:$LINENO: result: yes" >&5 -+$as_echo "yes" >&6; }; cat >>confdefs.h <<\_ACEOF -+#define HAVE_FD_CLOEXEC 1 -+_ACEOF -+ -+else -+ $as_echo "$as_me: failed program was:" >&5 -+sed 's/^/| /' conftest.$ac_ext >&5 -+ -+ { $as_echo "$as_me:$LINENO: result: not usable" >&5 -+$as_echo "not usable" >&6; } -+fi -+ -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+ - { $as_echo "$as_me:$LINENO: checking for rename" >&5 - $as_echo_n "checking for rename... " >&6; } - cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ - _ACEOF -@@ -15224,11 +15793,10 @@ cat >>confdefs.h <<_ACEOF - #define SIZEOF_INT $ac_cv_sizeof_int - _ACEOF - - - -- - bcopy_test_prog=' - #include "confdefs.h" - #ifdef HAVE_STRING_H - # include <string.h> - #endif -@@ -15456,11 +16024,11 @@ fi - - - if test "$enable_multibyte" = "yes"; then - cflags_save=$CFLAGS - ldflags_save=$LDFLAGS -- if test -n "$x_includes" ; then -+ if test "x$x_includes" != "xNONE" ; then - CFLAGS="$CFLAGS -I$x_includes" - LDFLAGS="$X_LIBS $LDFLAGS -lX11" - { $as_echo "$as_me:$LINENO: checking whether X_LOCALE needed" >&5 - $as_echo_n "checking whether X_LOCALE needed... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -@@ -15633,21 +16201,22 @@ rm -f core conftest.err conftest.$ac_obj - conftest$ac_exeext conftest.$ac_ext - LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_xpg4__xpg4_setrunelocale" >&5 - $as_echo "$ac_cv_lib_xpg4__xpg4_setrunelocale" >&6; } --if test $ac_cv_lib_xpg4__xpg4_setrunelocale = yes; then -+if test "x$ac_cv_lib_xpg4__xpg4_setrunelocale" = x""yes; then - LIBS="$LIBS -lxpg4" - fi - - - { $as_echo "$as_me:$LINENO: checking how to create tags" >&5 - $as_echo_n "checking how to create tags... " >&6; } - test -f tags && mv tags tags.save - if (eval ctags --version /dev/null | grep Exuberant) < /dev/null 1>&5 2>&1; then - TAGPRG="ctags -I INIT+ --fields=+S" - else -+ TAGPRG="ctags" - (eval etags /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="etags" - (eval etags -c /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="etags -c" - (eval ctags /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="ctags" - (eval ctags -t /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="ctags -t" - (eval ctags -ts /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="ctags -ts" -@@ -15931,12 +16500,13 @@ rm -f core conftest.err conftest.$ac_obj - fi - ac_res=`eval 'as_val=${'$as_ac_var'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 - $as_echo "$ac_res" >&6; } --if test `eval 'as_val=${'$as_ac_var'} -- $as_echo "$as_val"'` = yes; then -+as_val=`eval 'as_val=${'$as_ac_var'} -+ $as_echo "$as_val"'` -+ if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF - #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 - _ACEOF - - fi -@@ -16132,11 +16702,11 @@ else - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_header_dlfcn_h" >&5 - $as_echo "$ac_cv_header_dlfcn_h" >&6; } - - fi --if test $ac_cv_header_dlfcn_h = yes; then -+if test "x$ac_cv_header_dlfcn_h" = x""yes; then - DLL=dlfcn.h - else - if test "${ac_cv_header_dl_h+set}" = set; then - { $as_echo "$as_me:$LINENO: checking for dl.h" >&5 - $as_echo_n "checking for dl.h... " >&6; } -@@ -16262,11 +16832,11 @@ else - fi - { $as_echo "$as_me:$LINENO: result: $ac_cv_header_dl_h" >&5 - $as_echo "$ac_cv_header_dl_h" >&6; } - - fi --if test $ac_cv_header_dl_h = yes; then -+if test "x$ac_cv_header_dl_h" = x""yes; then - DLL=dl.h - fi - - - fi -@@ -16781,12 +17351,13 @@ ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 - $as_echo "$ac_res" >&6; } - - fi --if test `eval 'as_val=${'$as_ac_Header'} -- $as_echo "$as_val"'` = yes; then -+as_val=`eval 'as_val=${'$as_ac_Header'} -+ $as_echo "$as_val"'` -+ if test "x$as_val" = x""yes; then - cat >>confdefs.h <<_ACEOF - #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 - _ACEOF - - fi -@@ -16814,28 +17385,36 @@ $as_echo "yes" >&6; } - { $as_echo "$as_me:$LINENO: result: no" >&5 - $as_echo "no" >&6; } - fi - fi - if test "x$MACARCH" = "xboth"; then -- LDFLAGS="$LDFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" -+ LDFLAGS="$LDFLAGS -isysroot $DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" - fi - --{ $as_echo "$as_me:$LINENO: checking for GCC 3 or later" >&5 --$as_echo_n "checking for GCC 3 or later... " >&6; } - DEPEND_CFLAGS_FILTER= - if test "$GCC" = yes; then -+ { $as_echo "$as_me:$LINENO: checking for GCC 3 or later" >&5 -+$as_echo_n "checking for GCC 3 or later... " >&6; } - gccmajor=`echo "$gccversion" | sed -e 's/^\([1-9]\)\..*$/\1/g'` - if test "$gccmajor" -gt "2"; then - DEPEND_CFLAGS_FILTER="| sed 's+-I */+-isystem /+g'" -- fi --fi --if test "$DEPEND_CFLAGS_FILTER" = ""; then -- { $as_echo "$as_me:$LINENO: result: no" >&5 -+ { $as_echo "$as_me:$LINENO: result: yes" >&5 -+$as_echo "yes" >&6; } -+ else -+ { $as_echo "$as_me:$LINENO: result: no" >&5 - $as_echo "no" >&6; } --else -- { $as_echo "$as_me:$LINENO: result: yes" >&5 -+ fi -+ { $as_echo "$as_me:$LINENO: checking whether we need -D_FORTIFY_SOURCE=1" >&5 -+$as_echo_n "checking whether we need -D_FORTIFY_SOURCE=1... " >&6; } -+ if test "$gccmajor" -gt "3"; then -+ CFLAGS=`echo "$CFLAGS" | sed -e 's/-Wp,-D_FORTIFY_SOURCE=.//g' -e 's/-D_FORTIFY_SOURCE=.//g' -e 's/$/ -D_FORTIFY_SOURCE=1/'` -+ { $as_echo "$as_me:$LINENO: result: yes" >&5 - $as_echo "yes" >&6; } -+ else -+ { $as_echo "$as_me:$LINENO: result: no" >&5 -+$as_echo "no" >&6; } -+ fi - fi - - - ac_config_files="$ac_config_files auto/config.mk:config.mk.in" - -@@ -16864,12 +17443,12 @@ _ACEOF - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( -- *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 --$as_echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; -+ *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 -+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) $as_unset $ac_var ;; -@@ -17257,11 +17836,11 @@ exec 6>&1 - # Save the log message, to keep $[0] and so on meaningful, and to - # report actual input values of CONFIG_FILES etc. instead of their - # values after options handling. - ac_log=" - This file was extended by $as_me, which was --generated by GNU Autoconf 2.62. Invocation command line was -+generated by GNU Autoconf 2.63. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS -@@ -17270,10 +17849,19 @@ generated by GNU Autoconf 2.62. Invocat - on `(hostname || uname -n) 2>/dev/null | sed 1q` - " - - _ACEOF - -+case $ac_config_files in *" -+"*) set x $ac_config_files; shift; ac_config_files=$*;; -+esac -+ -+case $ac_config_headers in *" -+"*) set x $ac_config_headers; shift; ac_config_headers=$*;; -+esac -+ -+ - cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - # Files that config.status was made for. - config_files="$ac_config_files" - config_headers="$ac_config_headers" - -@@ -17282,20 +17870,21 @@ _ACEOF - cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - ac_cs_usage="\ - \`$as_me' instantiates files from templates according to the - current configuration. - --Usage: $0 [OPTIONS] [FILE]... -+Usage: $0 [OPTION]... [FILE]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit -- -q, --quiet do not print progress messages -+ -q, --quiet, --silent -+ do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions -- --file=FILE[:TEMPLATE] -+ --file=FILE[:TEMPLATE] - instantiate the configuration file FILE -- --header=FILE[:TEMPLATE] -+ --header=FILE[:TEMPLATE] - instantiate the configuration header FILE - - Configuration files: - $config_files - -@@ -17306,11 +17895,11 @@ Report bugs to <bug-autoconf@gnu.org>." - - _ACEOF - cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_cs_version="\\ - config.status --configured by $0, generated by GNU Autoconf 2.62, -+configured by $0, generated by GNU Autoconf 2.63, - with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" - - Copyright (C) 2008 Free Software Foundation, Inc. - This config.status script is free software; the Free Software Foundation - gives unlimited permission to copy, distribute and modify it." -@@ -17503,11 +18092,12 @@ for ac_last_try in false false false fal - . ./conf$$subs.sh || - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 - $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } - -- if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` = $ac_delim_num; then -+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` -+ if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 - $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } -@@ -17708,21 +18298,21 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ - defundef = substr(arg[1], 2) - mac1 = arg[2] - } - split(mac1, mac2, "(") #) - macro = mac2[1] -+ prefix = substr(line, 1, index(line, defundef) - 1) - if (D_is_set[macro]) { - # Preserve the white space surrounding the "#". -- prefix = substr(line, 1, index(line, defundef) - 1) - print prefix "define", macro P[macro] D[macro] - next - } else { - # Replace #undef with comments. This is necessary, for example, - # in the case of _POSIX_SOURCE, which is predefined and required - # on some systems where configure will not decide to define it. - if (defundef == "undef") { -- print "/*", line, "*/" -+ print "/*", prefix defundef, macro, "*/" - next - } - } - } - { print } -@@ -17742,12 +18332,12 @@ do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; -- :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 --$as_echo "$as_me: error: Invalid tag $ac_tag." >&2;} -+ :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 -+$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} - { (exit 1); exit 1; }; };; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS -@@ -18061,10 +18651,10 @@ if test "$no_create" != yes; then - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || { (exit 1); exit 1; } - fi - if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then -- { $as_echo "$as_me:$LINENO: WARNING: Unrecognized options: $ac_unrecognized_opts" >&5 --$as_echo "$as_me: WARNING: Unrecognized options: $ac_unrecognized_opts" >&2;} -+ { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} - fi - - ---- vim72.orig/src/buffer.c -+++ vim72/src/buffer.c -@@ -31,21 +31,22 @@ - static char_u *buflist_match __ARGS((regprog_T *prog, buf_T *buf)); - # define HAVE_BUFLIST_MATCH - static char_u *fname_match __ARGS((regprog_T *prog, char_u *name)); - #endif - static void buflist_setfpos __ARGS((buf_T *buf, win_T *win, linenr_T lnum, colnr_T col, int copy_options)); --static wininfo_T *find_wininfo __ARGS((buf_T *buf)); -+static wininfo_T *find_wininfo __ARGS((buf_T *buf, int skip_diff_buffer)); - #ifdef UNIX - static buf_T *buflist_findname_stat __ARGS((char_u *ffname, struct stat *st)); - static int otherfile_buf __ARGS((buf_T *buf, char_u *ffname, struct stat *stp)); - static int buf_same_ino __ARGS((buf_T *buf, struct stat *stp)); - #else - static int otherfile_buf __ARGS((buf_T *buf, char_u *ffname)); - #endif - #ifdef FEAT_TITLE - static int ti_change __ARGS((char_u *str, char_u **last)); - #endif -+static int append_arg_number __ARGS((win_T *wp, char_u *buf, int buflen, int add_file)); - static void free_buffer __ARGS((buf_T *)); - static void free_buffer_stuff __ARGS((buf_T *buf, int free_options)); - static void clear_wininfo __ARGS((buf_T *buf)); - - #ifdef UNIX -@@ -112,11 +113,11 @@ open_buffer(read_stdin, eap) - old_curbuf = curbuf; - modified_was_set = FALSE; - #endif - - /* mark cursor position as being invalid */ -- changed_line_abv_curs(); -+ curwin->w_valid = 0; - - if (curbuf->b_ffname != NULL - #ifdef FEAT_NETBEANS_INTG - && netbeansReadFile - #endif -@@ -312,11 +313,11 @@ close_buffer(win, buf, action) - buf_T *buf; - int action; - { - #ifdef FEAT_AUTOCMD - int is_curbuf; -- int nwindows = buf->b_nwindows; -+ int nwindows; - #endif - int unload_buf = (action != 0); - int del_buf = (action == DOBUF_DEL || action == DOBUF_WIPE); - int wipe_buf = (action == DOBUF_WIPE); - -@@ -435,14 +436,10 @@ close_buffer(win, buf, action) - */ - if (buf == curbuf && !is_curbuf) - return; - #endif - --#ifdef FEAT_NETBEANS_INTG -- if (usingNetbeans) -- netbeans_file_closed(buf); --#endif - /* Change directories when the 'acd' option is set. */ - DO_AUTOCHDIR - - /* - * Remove the buffer from the list. -@@ -513,16 +510,15 @@ buf_clear_file(buf) - - /* - * buf_freeall() - free all things allocated for a buffer that are related to - * the file. - */ --/*ARGSUSED*/ - void - buf_freeall(buf, del_buf, wipe_buf) - buf_T *buf; -- int del_buf; /* buffer is going to be deleted */ -- int wipe_buf; /* buffer is going to be wiped out */ -+ int del_buf UNUSED; /* buffer is going to be deleted */ -+ int wipe_buf UNUSED; /* buffer is going to be wiped out */ - { - #ifdef FEAT_AUTOCMD - int is_curbuf = (buf == curbuf); - - apply_autocmds(EVENT_BUFUNLOAD, buf->b_fname, buf->b_fname, FALSE, buf); -@@ -637,18 +633,25 @@ free_buffer_stuff(buf, free_options) - uc_clear(&buf->b_ucmds); /* clear local user commands */ - #endif - #ifdef FEAT_SIGNS - buf_delete_signs(buf); /* delete any signs */ - #endif -+#ifdef FEAT_NETBEANS_INTG -+ if (usingNetbeans) -+ netbeans_file_killed(buf); -+#endif - #ifdef FEAT_LOCALMAP - map_clear_int(buf, MAP_ALL_MODES, TRUE, FALSE); /* clear local mappings */ - map_clear_int(buf, MAP_ALL_MODES, TRUE, TRUE); /* clear local abbrevs */ - #endif - #ifdef FEAT_MBYTE - vim_free(buf->b_start_fenc); - buf->b_start_fenc = NULL; - #endif -+#ifdef FEAT_SPELL -+ ga_clear(&buf->b_langp); -+#endif - } - - /* - * Free the b_wininfo list for buffer "buf". - */ -@@ -810,13 +813,10 @@ do_bufdel(command, arg, addr_count, star - int deleted = 0; /* number of buffers deleted */ - char_u *errormsg = NULL; /* return value */ - int bnr; /* buffer number */ - char_u *p; - --#ifdef FEAT_NETBEANS_INTG -- netbeansCloseFile = 1; --#endif - if (addr_count == 0) - { - (void)do_buffer(command, DOBUF_CURRENT, FORWARD, 0, forceit); - } - else -@@ -907,13 +907,10 @@ do_bufdel(command, arg, addr_count, star - smsg((char_u *)_("%d buffers wiped out"), deleted); - } - } - } - --#ifdef FEAT_NETBEANS_INTG -- netbeansCloseFile = 0; --#endif - - return errormsg; - } - - /* -@@ -1088,11 +1085,11 @@ do_buffer(action, start, dir, count, for - #ifdef FEAT_WINDOWS - close_windows(buf, TRUE); - #endif - setpcmark(); - retval = do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, -- forceit ? ECMD_FORCEIT : 0); -+ forceit ? ECMD_FORCEIT : 0, curwin); - - /* - * do_ecmd() may create a new buffer, then we have to delete - * the old one. But do_ecmd() may have done that already, check - * if the buffer still exists. -@@ -1235,11 +1232,11 @@ do_buffer(action, start, dir, count, for - # ifdef FEAT_WINDOWS - /* If 'switchbuf' contains "useopen": jump to first window containing - * "buf" if one exists */ - if ((swb_flags & SWB_USEOPEN) && buf_jump_open_win(buf)) - return OK; -- /* If 'switchbuf' contians "usetab": jump to first window in any tab -+ /* If 'switchbuf' contains "usetab": jump to first window in any tab - * page containing "buf" if one exists */ - if ((swb_flags & SWB_USETAB) && buf_jump_open_tab(buf)) - return OK; - if (win_split(0, 0) == FAIL) - # endif -@@ -1311,11 +1308,11 @@ set_curbuf(buf, action) - || action == DOBUF_WIPE); - - setpcmark(); - if (!cmdmod.keepalt) - curwin->w_alt_fnum = curbuf->b_fnum; /* remember alternate file */ -- buflist_altfpos(); /* remember curpos */ -+ buflist_altfpos(curwin); /* remember curpos */ - - #ifdef FEAT_VISUAL - /* Don't restart Select mode after switching to another buffer. */ - VIsual_reselect = FALSE; - #endif -@@ -1349,15 +1346,16 @@ set_curbuf(buf, action) - && !P_HID(prevbuf) - && !bufIsChanged(prevbuf)) ? DOBUF_UNLOAD : 0); - } - } - #ifdef FEAT_AUTOCMD -+ /* An autocommand may have deleted "buf", already entered it (e.g., when -+ * it did ":bunload") or aborted the script processing! */ - # ifdef FEAT_EVAL -- /* An autocommand may have deleted buf or aborted the script processing! */ -- if (buf_valid(buf) && !aborting()) -+ if (buf_valid(buf) && buf != curbuf && !aborting()) - # else -- if (buf_valid(buf)) /* an autocommand may have deleted buf! */ -+ if (buf_valid(buf) && buf != curbuf) - # endif - #endif - enter_buffer(buf); - } - -@@ -1395,10 +1393,16 @@ enter_buffer(buf) - curwin->w_cursor.col = 0; - #ifdef FEAT_VIRTUALEDIT - curwin->w_cursor.coladd = 0; - #endif - curwin->w_set_curswant = TRUE; -+#ifdef FEAT_AUTOCMD -+ curwin->w_topline_was_set = FALSE; -+#endif -+ -+ /* mark cursor position as being invalid */ -+ curwin->w_valid = 0; - - /* Make sure the buffer is loaded. */ - if (curbuf->b_ml.ml_mfp == NULL) /* need to load the file */ - { - #ifdef FEAT_AUTOCMD -@@ -1434,11 +1438,12 @@ enter_buffer(buf) - check_arg_idx(curwin); /* check for valid arg_idx */ - #ifdef FEAT_TITLE - maketitle(); - #endif - #ifdef FEAT_AUTOCMD -- if (curwin->w_topline == 1) /* when autocmds didn't change it */ -+ /* when autocmds didn't change it */ -+ if (curwin->w_topline == 1 && !curwin->w_topline_was_set) - #endif - scroll_cursor_halfway(FALSE); /* redisplay at correct position */ - - #ifdef FEAT_NETBEANS_INTG - /* Send fileOpened event because we've changed buffers. */ -@@ -1449,17 +1454,17 @@ enter_buffer(buf) - /* Change directories when the 'acd' option is set. */ - DO_AUTOCHDIR - - #ifdef FEAT_KEYMAP - if (curbuf->b_kmap_state & KEYMAP_INIT) -- keymap_init(); -+ (void)keymap_init(); - #endif - #ifdef FEAT_SPELL - /* May need to set the spell language. Can only do this after the buffer - * has been properly setup. */ - if (!curbuf->b_help && curwin->w_p_spell && *curbuf->b_p_spl != NUL) -- did_set_spelllang(curbuf); -+ (void)did_set_spelllang(curbuf); - #endif - - redraw_later(NOT_VALID); - } - -@@ -1673,13 +1678,14 @@ buflist_new(ffname, sfname, lnum, flags) - #endif - - buf->b_fname = buf->b_sfname; - #ifdef UNIX - if (st.st_dev == (dev_T)-1) -- buf->b_dev = -1; -+ buf->b_dev_valid = FALSE; - else - { -+ buf->b_dev_valid = TRUE; - buf->b_dev = st.st_dev; - buf->b_ino = st.st_ino; - } - #endif - buf->b_u_synced = TRUE; -@@ -2020,17 +2026,16 @@ buflist_findname_stat(ffname, stp) - /* - * Find file in buffer list by a regexp pattern. - * Return fnum of the found buffer. - * Return < 0 for error. - */ --/*ARGSUSED*/ - int - buflist_findpat(pattern, pattern_end, unlisted, diffmode) - char_u *pattern; - char_u *pattern_end; /* pointer to first char after pattern */ - int unlisted; /* find unlisted buffers */ -- int diffmode; /* find diff-mode buffers only */ -+ int diffmode UNUSED; /* find diff-mode buffers only */ - { - buf_T *buf; - regprog_T *prog; - int match = -1; - int find_listed; -@@ -2398,26 +2403,73 @@ buflist_setfpos(buf, win, lnum, col, cop - wip->wi_next->wi_prev = wip; - - return; - } - -+#ifdef FEAT_DIFF -+static int wininfo_other_tab_diff __ARGS((wininfo_T *wip)); -+ -+/* -+ * Return TRUE when "wip" has 'diff' set and the diff is only for another tab -+ * page. That's because a diff is local to a tab page. -+ */ -+ static int -+wininfo_other_tab_diff(wip) -+ wininfo_T *wip; -+{ -+ win_T *wp; -+ -+ if (wip->wi_opt.wo_diff) -+ { -+ for (wp = firstwin; wp != NULL; wp = wp->w_next) -+ /* return FALSE when it's a window in the current tab page, thus -+ * the buffer was in diff mode here */ -+ if (wip->wi_win == wp) -+ return FALSE; -+ return TRUE; -+ } -+ return FALSE; -+} -+#endif -+ - /* - * Find info for the current window in buffer "buf". - * If not found, return the info for the most recently used window. -+ * When "skip_diff_buffer" is TRUE avoid windows with 'diff' set that is in -+ * another tab page. - * Returns NULL when there isn't any info. - */ - static wininfo_T * --find_wininfo(buf) -+find_wininfo(buf, skip_diff_buffer) - buf_T *buf; -+ int skip_diff_buffer UNUSED; - { - wininfo_T *wip; - - for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next) -- if (wip->wi_win == curwin) -+ if (wip->wi_win == curwin -+#ifdef FEAT_DIFF -+ && (!skip_diff_buffer || !wininfo_other_tab_diff(wip)) -+#endif -+ ) - break; -- if (wip == NULL) /* if no fpos for curwin, use the first in the list */ -- wip = buf->b_wininfo; -+ -+ /* If no wininfo for curwin, use the first in the list (that doesn't have -+ * 'diff' set and is in another tab page). */ -+ if (wip == NULL) -+ { -+#ifdef FEAT_DIFF -+ if (skip_diff_buffer) -+ { -+ for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next) -+ if (!wininfo_other_tab_diff(wip)) -+ break; -+ } -+ else -+#endif -+ wip = buf->b_wininfo; -+ } - return wip; - } - - /* - * Reset the local window options to the values last used in this window. -@@ -2434,11 +2486,11 @@ get_winopts(buf) - clear_winopt(&curwin->w_onebuf_opt); - #ifdef FEAT_FOLDING - clearFolding(curwin); - #endif - -- wip = find_wininfo(buf); -+ wip = find_wininfo(buf, TRUE); - if (wip != NULL && wip->wi_optset) - { - copy_winopt(&wip->wi_opt, &curwin->w_onebuf_opt); - #ifdef FEAT_FOLDING - curwin->w_fold_manual = wip->wi_fold_manual; -@@ -2464,13 +2516,13 @@ get_winopts(buf) - pos_T * - buflist_findfpos(buf) - buf_T *buf; - { - wininfo_T *wip; -- static pos_T no_position = {1, 0}; -+ static pos_T no_position = INIT_POS_T(1, 0, 0); - -- wip = find_wininfo(buf); -+ wip = find_wininfo(buf, FALSE); - if (wip != NULL) - return &(wip->wi_fpos); - else - return &no_position; - } -@@ -2487,11 +2539,10 @@ buflist_findlnum(buf) - - #if defined(FEAT_LISTCMDS) || defined(PROTO) - /* - * List all know file names (for :files and :buffers command). - */ --/*ARGSUSED*/ - void - buflist_list(eap) - exarg_T *eap; - { - buf_T *buf; -@@ -2525,12 +2576,12 @@ buflist_list(eap) - i = 40 - vim_strsize(IObuff); - do - { - IObuff[len++] = ' '; - } while (--i > 0 && len < IOSIZE - 18); -- vim_snprintf((char *)IObuff + len, IOSIZE - len, _("line %ld"), -- buf == curbuf ? curwin->w_cursor.lnum -+ vim_snprintf((char *)IObuff + len, (size_t)(IOSIZE - len), -+ _("line %ld"), buf == curbuf ? curwin->w_cursor.lnum - : (long)buflist_findlnum(buf)); - msg_outtrans(IObuff); - out_flush(); /* output one line at a time */ - ui_breakcheck(); - } -@@ -2640,13 +2691,14 @@ setfname(buf, ffname, sfname, message) - buf->b_sfname = sfname; - } - buf->b_fname = buf->b_sfname; - #ifdef UNIX - if (st.st_dev == (dev_T)-1) -- buf->b_dev = -1; -+ buf->b_dev_valid = FALSE; - else - { -+ buf->b_dev_valid = TRUE; - buf->b_dev = st.st_dev; - buf->b_ino = st.st_ino; - } - #endif - -@@ -2787,18 +2839,18 @@ buflist_slash_adjust() - } - } - #endif - - /* -- * Set alternate cursor position for current window. -+ * Set alternate cursor position for the current buffer and window "win". - * Also save the local window option values. - */ - void --buflist_altfpos() -+buflist_altfpos(win) -+ win_T *win; - { -- buflist_setfpos(curbuf, curwin, curwin->w_cursor.lnum, -- curwin->w_cursor.col, TRUE); -+ buflist_setfpos(curbuf, win, win->w_cursor.lnum, win->w_cursor.col, TRUE); - } - - /* - * Return TRUE if 'ffname' is not the same file as current file. - * Fname must have a full path (expanded by mch_FullName()). -@@ -2836,11 +2888,11 @@ otherfile_buf(buf, ffname - struct stat st; - - /* If no struct stat given, get it now */ - if (stp == NULL) - { -- if (buf->b_dev < 0 || mch_stat((char *)ffname, &st) < 0) -+ if (!buf->b_dev_valid || mch_stat((char *)ffname, &st) < 0) - st.st_dev = (dev_T)-1; - stp = &st; - } - /* Use dev/ino to check if the files are the same, even when the names - * are different (possible with links). Still need to compare the -@@ -2873,26 +2925,27 @@ buf_setino(buf) - { - struct stat st; - - if (buf->b_fname != NULL && mch_stat((char *)buf->b_fname, &st) >= 0) - { -+ buf->b_dev_valid = TRUE; - buf->b_dev = st.st_dev; - buf->b_ino = st.st_ino; - } - else -- buf->b_dev = -1; -+ buf->b_dev_valid = FALSE; - } - - /* - * Return TRUE if dev/ino in buffer "buf" matches with "stp". - */ - static int - buf_same_ino(buf, stp) - buf_T *buf; - struct stat *stp; - { -- return (buf->b_dev >= 0 -+ return (buf->b_dev_valid - && stp->st_dev == buf->b_dev - && stp->st_ino == buf->b_ino); - } - #endif - -@@ -2915,11 +2968,11 @@ fileinfo(fullname, shorthelp, dont_trunc - if (buffer == NULL) - return; - - if (fullname > 1) /* 2 CTRL-G: include buffer number */ - { -- sprintf((char *)buffer, "buf %d: ", curbuf->b_fnum); -+ vim_snprintf((char *)buffer, IOSIZE, "buf %d: ", curbuf->b_fnum); - p = buffer + STRLEN(buffer); - } - else - p = buffer; - -@@ -2989,15 +3042,16 @@ fileinfo(fullname, shorthelp, dont_trunc - _("line %ld of %ld --%d%%-- col "), - (long)curwin->w_cursor.lnum, - (long)curbuf->b_ml.ml_line_count, - n); - validate_virtcol(); -- col_print(buffer + STRLEN(buffer), -+ len = STRLEN(buffer); -+ col_print(buffer + len, IOSIZE - len, - (int)curwin->w_cursor.col + 1, (int)curwin->w_virtcol + 1); - } - -- (void)append_arg_number(curwin, buffer, !shortmess(SHM_FILE), IOSIZE); -+ (void)append_arg_number(curwin, buffer, IOSIZE, !shortmess(SHM_FILE)); - - if (dont_truncate) - { - /* Temporarily set msg_scroll to avoid the message being truncated. - * First call msg_start() to get the message in the right place. */ -@@ -3021,19 +3075,20 @@ fileinfo(fullname, shorthelp, dont_trunc - - vim_free(buffer); - } - - void --col_print(buf, col, vcol) -+col_print(buf, buflen, col, vcol) - char_u *buf; -+ size_t buflen; - int col; - int vcol; - { - if (col == vcol) -- sprintf((char *)buf, "%d", col); -+ vim_snprintf((char *)buf, buflen, "%d", col); - else -- sprintf((char *)buf, "%d-%d", col, vcol); -+ vim_snprintf((char *)buf, buflen, "%d-%d", col, vcol); - } - - #if defined(FEAT_TITLE) || defined(PROTO) - /* - * put file name in title bar of window and in icon title -@@ -3142,22 +3197,22 @@ maketitle() - /* remove the file name */ - p = gettail_sep(buf + off); - if (p == buf + off) - /* must be a help buffer */ - vim_strncpy(buf + off, (char_u *)_("help"), -- IOSIZE - off - 1); -+ (size_t)(IOSIZE - off - 1)); - else - *p = NUL; - - /* translate unprintable chars */ - p = transstr(buf + off); -- vim_strncpy(buf + off, p, IOSIZE - off - 1); -+ vim_strncpy(buf + off, p, (size_t)(IOSIZE - off - 1)); - vim_free(p); - STRCAT(buf, ")"); - } - -- append_arg_number(curwin, buf, FALSE, IOSIZE); -+ append_arg_number(curwin, buf, IOSIZE, FALSE); - - #if defined(FEAT_CLIENTSERVER) - if (serverName != NULL) - { - STRCAT(buf, " - "); -@@ -3290,18 +3345,17 @@ free_titles() - * Item: %-<minwid>.<maxwid><itemch> All but <itemch> are optional - * - * If maxwidth is not zero, the string will be filled at any middle marker - * or truncated if too long, fillchar is used for all whitespace. - */ --/*ARGSUSED*/ - int - build_stl_str_hl(wp, out, outlen, fmt, use_sandbox, fillchar, maxwidth, hltab, tabtab) - win_T *wp; - char_u *out; /* buffer to write into != NameBuff */ - size_t outlen; /* length of out[] */ - char_u *fmt; -- int use_sandbox; /* "fmt" was set insecurely, use sandbox */ -+ int use_sandbox UNUSED; /* "fmt" was set insecurely, use sandbox */ - int fillchar; - int maxwidth; - struct stl_hlrec *hltab; /* return: HL attributes (can be NULL) */ - struct stl_hlrec *tabtab; /* return: tab page nrs (can be NULL) */ - { -@@ -3468,11 +3522,11 @@ build_stl_str_hl(wp, out, outlen, fmt, u - else - #endif - n = (long)(p - t) - item[groupitem[groupdepth]].maxwid + 1; - - *t = '<'; -- mch_memmove(t + 1, t + n, p - (t + n)); -+ mch_memmove(t + 1, t + n, (size_t)(p - (t + n))); - p = p - n + 1; - #ifdef FEAT_MBYTE - /* Fill up space left over by half a double-wide char. */ - while (++l < item[groupitem[groupdepth]].minwid) - *p++ = fillchar; -@@ -3498,11 +3552,11 @@ build_stl_str_hl(wp, out, outlen, fmt, u - *p++ = fillchar; - } - else - { - /* fill by inserting characters */ -- mch_memmove(t + n - l, t, p - t); -+ mch_memmove(t + n - l, t, (size_t)(p - t)); - l = n - l; - if (p + l >= out + outlen) - l = (long)((out + outlen) - p - 1); - p += l; - for (n = groupitem[groupdepth] + 1; n < curitem; n++) -@@ -3634,11 +3688,11 @@ build_stl_str_hl(wp, out, outlen, fmt, u - s++; - *p = 0; - p = t; - - #ifdef FEAT_EVAL -- sprintf((char *)tmp, "%d", curbuf->b_fnum); -+ vim_snprintf((char *)tmp, sizeof(tmp), "%d", curbuf->b_fnum); - set_internal_string_var((char_u *)"actual_curbuf", tmp); - - o_curbuf = curbuf; - o_curwin = curwin; - curwin = wp; -@@ -3701,17 +3755,17 @@ build_stl_str_hl(wp, out, outlen, fmt, u - (long)wp->w_buffer->b_ml.ml_line_count); - break; - - case STL_ALTPERCENT: - str = tmp; -- get_rel_pos(wp, str); -+ get_rel_pos(wp, str, TMPLEN); - break; - - case STL_ARGLISTSTAT: - fillable = FALSE; - tmp[0] = 0; -- if (append_arg_number(wp, tmp, FALSE, (int)sizeof(tmp))) -+ if (append_arg_number(wp, tmp, (int)sizeof(tmp), FALSE)) - str = tmp; - break; - - case STL_KEYMAP: - fillable = FALSE; -@@ -3742,11 +3796,11 @@ build_stl_str_hl(wp, out, outlen, fmt, u - break; - - case STL_BYTEVAL_X: - base = 'X'; - case STL_BYTEVAL: -- if (wp->w_cursor.col > STRLEN(linecont)) -+ if (wp->w_cursor.col > (colnr_T)STRLEN(linecont)) - num = 0; - else - { - #ifdef FEAT_MBYTE - num = (*mb_ptr2char)(linecont + wp->w_cursor.col); -@@ -3915,11 +3969,11 @@ build_stl_str_hl(wp, out, outlen, fmt, u - } - *t++ = '%'; - if (zeropad) - *t++ = '0'; - *t++ = '*'; -- *t++ = nbase == 16 ? base : (nbase == 8 ? 'o' : 'd'); -+ *t++ = nbase == 16 ? base : (char_u)(nbase == 8 ? 'o' : 'd'); - *t = 0; - - for (n = num, l = 1; n >= nbase; n /= nbase) - l++; - if (opt == STL_VIRTCOL_ALT) -@@ -3961,11 +4015,11 @@ build_stl_str_hl(wp, out, outlen, fmt, u - #endif - - width = vim_strsize(out); - if (maxwidth > 0 && width > maxwidth) - { -- /* Result is too long, must trunctate somewhere. */ -+ /* Result is too long, must truncate somewhere. */ - l = 0; - if (itemcnt == 0) - s = out; - else - { -@@ -4108,64 +4162,67 @@ build_stl_str_hl(wp, out, outlen, fmt, u - #endif /* FEAT_STL_OPT */ - - #if defined(FEAT_STL_OPT) || defined(FEAT_CMDL_INFO) \ - || defined(FEAT_GUI_TABLINE) || defined(PROTO) - /* -- * Get relative cursor position in window into "str[]", in the form 99%, using -- * "Top", "Bot" or "All" when appropriate. -+ * Get relative cursor position in window into "buf[buflen]", in the form 99%, -+ * using "Top", "Bot" or "All" when appropriate. - */ - void --get_rel_pos(wp, str) -+get_rel_pos(wp, buf, buflen) - win_T *wp; -- char_u *str; -+ char_u *buf; -+ int buflen; - { - long above; /* number of lines above window */ - long below; /* number of lines below window */ - - above = wp->w_topline - 1; - #ifdef FEAT_DIFF - above += diff_check_fill(wp, wp->w_topline) - wp->w_topfill; - #endif - below = wp->w_buffer->b_ml.ml_line_count - wp->w_botline + 1; - if (below <= 0) -- STRCPY(str, above == 0 ? _("All") : _("Bot")); -+ vim_strncpy(buf, (char_u *)(above == 0 ? _("All") : _("Bot")), -+ (size_t)(buflen - 1)); - else if (above <= 0) -- STRCPY(str, _("Top")); -+ vim_strncpy(buf, (char_u *)_("Top"), (size_t)(buflen - 1)); - else -- sprintf((char *)str, "%2d%%", above > 1000000L -+ vim_snprintf((char *)buf, (size_t)buflen, "%2d%%", above > 1000000L - ? (int)(above / ((above + below) / 100L)) - : (int)(above * 100L / (above + below))); - } - #endif - - /* -- * Append (file 2 of 8) to 'buf', if editing more than one file. -+ * Append (file 2 of 8) to "buf[buflen]", if editing more than one file. - * Return TRUE if it was appended. - */ -- int --append_arg_number(wp, buf, add_file, maxlen) -+ static int -+append_arg_number(wp, buf, buflen, add_file) - win_T *wp; - char_u *buf; -+ int buflen; - int add_file; /* Add "file" before the arg number */ -- int maxlen; /* maximum nr of chars in buf or zero*/ - { - char_u *p; - - if (ARGCOUNT <= 1) /* nothing to do */ - return FALSE; - -- p = buf + STRLEN(buf); /* go to the end of the buffer */ -- if (maxlen && p - buf + 35 >= maxlen) /* getting too long */ -+ p = buf + STRLEN(buf); /* go to the end of the buffer */ -+ if (p - buf + 35 >= buflen) /* getting too long */ - return FALSE; - *p++ = ' '; - *p++ = '('; - if (add_file) - { - STRCPY(p, "file "); - p += 5; - } -- sprintf((char *)p, wp->w_arg_idx_invalid ? "(%d) of %d)" -+ vim_snprintf((char *)p, (size_t)(buflen - (p - buf)), -+ wp->w_arg_idx_invalid ? "(%d) of %d)" - : "%d of %d)", wp->w_arg_idx + 1, ARGCOUNT); - return TRUE; - } - - /* -@@ -4217,14 +4274,13 @@ fix_fname(fname) - - /* - * Make "ffname" a full file name, set "sfname" to "ffname" if not NULL. - * "ffname" becomes a pointer to allocated memory (or NULL). - */ --/*ARGSUSED*/ - void - fname_expand(buf, ffname, sfname) -- buf_T *buf; -+ buf_T *buf UNUSED; - char_u **ffname; - char_u **sfname; - { - if (*ffname == NULL) /* if no file name given, nothing to do */ - return; -@@ -4486,11 +4542,11 @@ do_arg_all(count, forceit, keep_tabs) - } - (void)do_ecmd(0, alist_name(&AARGLIST(alist)[i]), NULL, NULL, - ECMD_ONE, - ((P_HID(curwin->w_buffer) - || bufIsChanged(curwin->w_buffer)) ? ECMD_HIDE : 0) -- + ECMD_OLDBUF); -+ + ECMD_OLDBUF, curwin); - #ifdef FEAT_AUTOCMD - if (use_firstwin) - ++autocmd_no_leave; - #endif - use_firstwin = FALSE; -@@ -4944,11 +5000,11 @@ read_viminfo_bufferlist(virp, writing) - col = 0; - tab = vim_strrchr(xline, '\t'); - if (tab != NULL) - { - *tab++ = '\0'; -- col = atoi((char *)tab); -+ col = (colnr_T)atoi((char *)tab); - tab = vim_strrchr(xline, '\t'); - if (tab != NULL) - { - *tab++ = '\0'; - lnum = atol((char *)tab); -@@ -4982,19 +5038,21 @@ write_viminfo_bufferlist(fp) - win_T *win; - tabpage_T *tp; - #endif - char_u *line; - int max_buffers; -+ size_t len; - - if (find_viminfo_parameter('%') == NULL) - return; - - /* Without a number -1 is returned: do all buffers. */ - max_buffers = get_viminfo_parameter('%'); - - /* Allocate room for the file name, lnum and col. */ -- line = alloc(MAXPATHL + 40); -+#define LINE_BUF_LEN (MAXPATHL + 40) -+ line = alloc(LINE_BUF_LEN); - if (line == NULL) - return; - - #ifdef FEAT_WINDOWS - FOR_ALL_TAB_WINDOWS(tp, win) -@@ -5016,11 +5074,12 @@ write_viminfo_bufferlist(fp) - - if (max_buffers-- == 0) - break; - putc('%', fp); - home_replace(NULL, buf->b_ffname, line, MAXPATHL, TRUE); -- sprintf((char *)line + STRLEN(line), "\t%ld\t%d", -+ len = STRLEN(line); -+ vim_snprintf((char *)line + len, len - LINE_BUF_LEN, "\t%ld\t%d", - (long)buf->b_last_cursor.lnum, - buf->b_last_cursor.col); - viminfo_writestring(fp, line); - } - vim_free(line); -@@ -5046,11 +5105,12 @@ buf_spname(buf) - * For location list window, w_llist_ref points to the location list. - * For quickfix window, w_llist_ref is NULL. - */ - FOR_ALL_TAB_WINDOWS(tp, win) - if (win->w_buffer == buf) -- break; -+ goto win_found; -+win_found: - if (win != NULL && win->w_llist_ref != NULL) - return _("[Location List]"); - else - return _("[Quickfix List]"); - } -@@ -5060,11 +5120,11 @@ buf_spname(buf) - * contains the name as specified by the user */ - if (bt_nofile(buf)) - { - if (buf->b_sfname != NULL) - return (char *)buf->b_sfname; -- return "[Scratch]"; -+ return _("[Scratch]"); - } - #endif - if (buf->b_fname == NULL) - return _("[No Name]"); - return NULL; -@@ -5173,11 +5233,11 @@ buf_addsign(buf, id, lnum, typenr) - insert_sign(buf, prev, sign, id, lnum, typenr); - - return; - } - -- int -+ linenr_T - buf_change_sign_type(buf, markId, typenr) - buf_T *buf; /* buffer to store sign in */ - int markId; /* sign ID */ - int typenr; /* typenr of sign we are adding */ - { -@@ -5190,14 +5250,14 @@ buf_change_sign_type(buf, markId, typenr - sign->typenr = typenr; - return sign->lnum; - } - } - -- return 0; -+ return (linenr_T)0; - } - -- int_u -+ int - buf_getsigntype(buf, lnum, type) - buf_T *buf; - linenr_T lnum; - int type; /* SIGN_ICON, SIGN_TEXT, SIGN_ANY, SIGN_LINEHL */ - { -@@ -5512,15 +5572,14 @@ buf_contents_changed(buf) - /* - * Wipe out a buffer and decrement the last buffer number if it was used for - * this buffer. Call this to wipe out a temp buffer that does not contain any - * marks. - */ --/*ARGSUSED*/ - void - wipe_buffer(buf, aucmd) - buf_T *buf; -- int aucmd; /* When TRUE trigger autocommands. */ -+ int aucmd UNUSED; /* When TRUE trigger autocommands. */ - { - if (buf->b_fnum == top_file_num - 1) - --top_file_num; - - #ifdef FEAT_AUTOCMD ---- vim72.orig/src/charset.c -+++ vim72/src/charset.c -@@ -15,11 +15,11 @@ static int win_chartabsize __ARGS((win_T - - #ifdef FEAT_MBYTE - static int win_nolbr_chartabsize __ARGS((win_T *wp, char_u *s, colnr_T col, int *headp)); - #endif - --static int nr2hex __ARGS((int c)); -+static unsigned nr2hex __ARGS((unsigned c)); - - static int chartab_initialized = FALSE; - - /* b_chartab[] is an array of 32 bytes, each bit representing one of the - * characters 0-255. */ -@@ -172,21 +172,31 @@ buf_init_chartab(buf, global) - ++p; - } - if (VIM_ISDIGIT(*p)) - c = getdigits(&p); - else -+#ifdef FEAT_MBYTE -+ if (has_mbyte) -+ c = mb_ptr2char_adv(&p); -+ else -+#endif - c = *p++; - c2 = -1; - if (*p == '-' && p[1] != NUL) - { - ++p; - if (VIM_ISDIGIT(*p)) - c2 = getdigits(&p); - else -+#ifdef FEAT_MBYTE -+ if (has_mbyte) -+ c2 = mb_ptr2char_adv(&p); -+ else -+#endif - c2 = *p++; - } -- if (c <= 0 || (c2 < c && c2 != -1) || c2 >= 256 -+ if (c <= 0 || c >= 256 || (c2 < c && c2 != -1) || c2 >= 256 - || !(*p == NUL || *p == ',')) - return FAIL; - - if (c2 == -1) /* not a range */ - { -@@ -662,23 +672,23 @@ transchar_hex(buf, c) - buf[++i] = nr2hex((unsigned)c >> 12); - buf[++i] = nr2hex((unsigned)c >> 8); - } - #endif - buf[++i] = nr2hex((unsigned)c >> 4); -- buf[++i] = nr2hex(c); -+ buf[++i] = nr2hex((unsigned)c); - buf[++i] = '>'; - buf[++i] = NUL; - } - - /* - * Convert the lower 4 bits of byte "c" to its hex character. - * Lower case letters are used to avoid the confusion of <F1> being 0xf1 or - * function key 1. - */ -- static int -+ static unsigned - nr2hex(c) -- int c; -+ unsigned c; - { - if ((c & 0xf) <= 9) - return (c & 0xf) + '0'; - return (c & 0xf) - 10 + 'a'; - } -@@ -882,11 +892,11 @@ vim_iswordc(c) - { - #ifdef FEAT_MBYTE - if (c >= 0x100) - { - if (enc_dbcs != 0) -- return dbcs_class((unsigned)c >> 8, c & 0xff) >= 2; -+ return dbcs_class((unsigned)c >> 8, (unsigned)(c & 0xff)) >= 2; - if (enc_utf8) - return utf_class(c) >= 2; - } - #endif - return (c > 0 && c < 0x100 && GET_CHARTAB(curbuf, c) != 0); -@@ -1024,17 +1034,16 @@ lbr_chartabsize_adv(s, col) - * - * If "headp" not NULL, set *headp to the size of what we for 'showbreak' - * string at start of line. Warning: *headp is only set if it's a non-zero - * value, init to 0 before calling. - */ --/*ARGSUSED*/ - int - win_lbr_chartabsize(wp, s, col, headp) - win_T *wp; - char_u *s; - colnr_T col; -- int *headp; -+ int *headp UNUSED; - { - #ifdef FEAT_LINEBREAK - int c; - int size; - colnr_T col2; -@@ -1088,11 +1097,11 @@ win_lbr_chartabsize(wp, s, col, headp) - * Count all characters from first non-blank after a blank up to next - * non-blank after a blank. - */ - numberextra = win_col_off(wp); - col2 = col; -- colmax = W_WIDTH(wp) - numberextra; -+ colmax = (colnr_T)(W_WIDTH(wp) - numberextra); - if (col >= colmax) - { - n = colmax + win_col_off2(wp); - if (n > 0) - colmax += (((col - colmax) / n) + 1) * n; -@@ -1199,23 +1208,25 @@ win_nolbr_chartabsize(wp, s, col, headp) - int - in_win_border(wp, vcol) - win_T *wp; - colnr_T vcol; - { -- colnr_T width1; /* width of first line (after line number) */ -- colnr_T width2; /* width of further lines */ -+ int width1; /* width of first line (after line number) */ -+ int width2; /* width of further lines */ - - #ifdef FEAT_VERTSPLIT - if (wp->w_width == 0) /* there is no border */ - return FALSE; - #endif - width1 = W_WIDTH(wp) - win_col_off(wp); -- if (vcol < width1 - 1) -+ if ((int)vcol < width1 - 1) - return FALSE; -- if (vcol == width1 - 1) -+ if ((int)vcol == width1 - 1) - return TRUE; - width2 = width1 + win_col_off2(wp); -+ if (width2 <= 0) -+ return FALSE; - return ((vcol - width1) % width2 == width2 - 1); - } - #endif /* FEAT_MBYTE */ - - /* -@@ -1242,11 +1253,14 @@ getvcol(wp, pos, start, cursor, end) - int ts = wp->w_buffer->b_p_ts; - int c; - - vcol = 0; - ptr = ml_get_buf(wp->w_buffer, pos->lnum, FALSE); -- posptr = ptr + pos->col; -+ if (pos->col == MAXCOL) -+ posptr = NULL; /* continue until the NUL */ -+ else -+ posptr = ptr + pos->col; - - /* - * This function is used very often, do some speed optimizations. - * When 'list', 'linebreak' and 'showbreak' are not set use a simple loop. - * Also use this when 'list' is set but tabs take their normal size. -@@ -1300,11 +1314,11 @@ getvcol(wp, pos, start, cursor, end) - else - #endif - incr = CHARSIZE(c); - } - -- if (ptr >= posptr) /* character at pos->col */ -+ if (posptr != NULL && ptr >= posptr) /* character at pos->col */ - break; - - vcol += incr; - mb_ptr_adv(ptr); - } -@@ -1321,11 +1335,11 @@ getvcol(wp, pos, start, cursor, end) - { - incr = 1; /* NUL at end of line only takes one column */ - break; - } - -- if (ptr >= posptr) /* character at pos->col */ -+ if (posptr != NULL && ptr >= posptr) /* character at pos->col */ - break; - - vcol += incr; - mb_ptr_adv(ptr); - } -@@ -1394,17 +1408,17 @@ getvvcol(wp, pos, start, cursor, end) - coladd = pos->coladd; - endadd = 0; - # ifdef FEAT_MBYTE - /* Cannot put the cursor on part of a wide character. */ - ptr = ml_get_buf(wp->w_buffer, pos->lnum, FALSE); -- if (pos->col < STRLEN(ptr)) -+ if (pos->col < (colnr_T)STRLEN(ptr)) - { - int c = (*mb_ptr2char)(ptr + pos->col); - - if (c != TAB && vim_isprintc(c)) - { -- endadd = char2cells(c) - 1; -+ endadd = (colnr_T)(char2cells(c) - 1); - if (coladd > endadd) /* past end of line */ - endadd = 0; - else - coladd = 0; - } ---- vim72.orig/src/config.h.in -+++ vim72/src/config.h.in -@@ -28,16 +28,22 @@ - #undef HAVE_OUTFUNTYPE - - /* Define when __DATE__ " " __TIME__ can be used */ - #undef HAVE_DATE_TIME - -+/* Define when __attribute__((unused)) can be used */ -+#undef HAVE_ATTRIBUTE_UNUSED -+ - /* defined always when using configure */ - #undef UNIX - - /* Defined to the size of an int */ - #undef SIZEOF_INT - -+/* Define when wchar_t is only 2 bytes. */ -+#undef SMALL_WCHAR_T -+ - /* - * If we cannot trust one of the following from the libraries, we use our - * own safe but probably slower vim_memmove(). - */ - #undef USEBCOPY -@@ -48,10 +54,13 @@ - #undef USEMAN_S - - /* Define to empty if the keyword does not work. */ - #undef const - -+/* Define to empty if the keyword does not work. */ -+#undef volatile -+ - /* Define to `int' if <sys/types.h> doesn't define. */ - #undef mode_t - - /* Define to `long' if <sys/types.h> doesn't define. */ - #undef off_t -@@ -133,11 +142,10 @@ - #undef HAVE_BCMP - #undef HAVE_FCHDIR - #undef HAVE_FCHOWN - #undef HAVE_FSEEKO - #undef HAVE_FSYNC --#undef HAVE_FTELLO - #undef HAVE_GETCWD - #undef HAVE_GETPSEUDOTTY - #undef HAVE_GETPWNAM - #undef HAVE_GETPWUID - #undef HAVE_GETRLIMIT -@@ -146,10 +154,11 @@ - #undef HAVE_ICONV - #undef HAVE_NL_LANGINFO_CODESET - #undef HAVE_LSTAT - #undef HAVE_MEMCMP - #undef HAVE_MEMSET -+#undef HAVE_MKDTEMP - #undef HAVE_NANOSLEEP - #undef HAVE_OPENDIR - #undef HAVE_FLOAT_FUNCS - #undef HAVE_PUTENV - #undef HAVE_QSORT -@@ -376,5 +385,8 @@ - /* Define name of who modified a released Vim */ - #undef MODIFIED_BY - - /* Define if you want XSMP interaction as well as vanilla swapfile safety */ - #undef USE_XSMP_INTERACT -+ -+/* Define if fcntl()'s F_SETFD command knows about FD_CLOEXEC */ -+#undef HAVE_FD_CLOEXEC ---- vim72.orig/src/config.mk.in -+++ vim72/src/config.mk.in -@@ -39,10 +39,12 @@ X_LIBS = @X_LIB@ - MZSCHEME_LIBS = @MZSCHEME_LIBS@ - MZSCHEME_SRC = @MZSCHEME_SRC@ - MZSCHEME_OBJ = @MZSCHEME_OBJ@ - MZSCHEME_CFLAGS = @MZSCHEME_CFLAGS@ - MZSCHEME_PRO = @MZSCHEME_PRO@ -+MZSCHEME_EXTRA = @MZSCHEME_EXTRA@ -+MZSCHEME_MZC = @MZSCHEME_MZC@ - - PERL = @vi_cv_path_perl@ - PERLLIB = @vi_cv_perllib@ - PERL_LIBS = @PERL_LIBS@ - SHRPENV = @shrpenv@ ---- vim72.orig/src/configure.in -+++ vim72/src/configure.in -@@ -114,10 +114,26 @@ if test "`(uname) 2>/dev/null`" = Darwin - AC_MSG_CHECKING(--with-mac-arch argument) - AC_ARG_WITH(mac-arch, [ --with-mac-arch=ARCH current, intel, ppc or both], - MACARCH="$withval"; AC_MSG_RESULT($MACARCH), - MACARCH="current"; AC_MSG_RESULT(defaulting to $MACARCH)) - -+ AC_MSG_CHECKING(--with-developer-dir argument) -+ AC_ARG_WITH(developer-dir, [ --with-developer-dir=PATH use PATH as location for Xcode developer tools], -+ DEVELOPER_DIR="$withval"; AC_MSG_RESULT($DEVELOPER_DIR), -+ DEVELOPER_DIR=""; AC_MSG_RESULT(not present)) -+ -+ if test "x$DEVELOPER_DIR" = "x"; then -+ AC_PATH_PROG(XCODE_SELECT, xcode-select) -+ if test "x$XCODE_SELECT" != "x"; then -+ AC_MSG_CHECKING(for developer dir using xcode-select) -+ DEVELOPER_DIR=`$XCODE_SELECT -print-path` -+ AC_MSG_RESULT([$DEVELOPER_DIR]) -+ else -+ DEVELOPER_DIR=/Developer -+ fi -+ fi -+ - if test "x$MACARCH" = "xboth"; then - AC_MSG_CHECKING(for 10.4 universal SDK) - dnl There is a terrible inconsistency (but we appear to get away with it): - dnl $CFLAGS uses the 10.4u SDK library for the headers, while $CPPFLAGS - dnl doesn't, because "gcc -E" doesn't grok it. That means the configure -@@ -125,11 +141,11 @@ if test "`(uname) 2>/dev/null`" = Darwin - dnl files. $LDFLAGS is set at the end, because configure uses it together - dnl with $CFLAGS and we can only have one -sysroot argument. - save_cppflags="$CPPFLAGS" - save_cflags="$CFLAGS" - save_ldflags="$LDFLAGS" -- CFLAGS="$CFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" -+ CFLAGS="$CFLAGS -isysroot $DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" - AC_TRY_LINK([ ], [ ], - AC_MSG_RESULT(found, will make universal binary), - - AC_MSG_RESULT(not found) - CFLAGS="$save_cflags" -@@ -155,13 +171,13 @@ if test "`(uname) 2>/dev/null`" = Darwin - OS_EXTRA_SRC="os_macosx.c os_mac_conv.c"; - OS_EXTRA_OBJ="objects/os_macosx.o objects/os_mac_conv.o" - dnl TODO: use -arch i386 on Intel machines - CPPFLAGS="$CPPFLAGS -DMACOS_X_UNIX -no-cpp-precomp" - if test "x$MACARCH" = "xboth"; then -- CPPFLAGS="$CPPFLAGS -I/Developer/SDKs/MacOSX10.4u.sdk/Developer/Headers/FlatCarbon" -+ CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk/Developer/Headers/FlatCarbon" - else -- CPPFLAGS="$CPPFLAGS -I/Developer/Headers/FlatCarbon" -+ CPPFLAGS="$CPPFLAGS -I$DEVELOPER_DIR/Headers/FlatCarbon" - fi - - dnl If Carbon is found, assume we don't want X11 - dnl unless it was specifically asked for (--with-x) - dnl or Motif, Athena or GTK GUI is used. -@@ -412,11 +428,11 @@ if test "$enable_mzschemeinterp" = "yes" - AC_MSG_CHECKING(PLTHOME environment var) - if test "X$PLTHOME" != "X"; then - AC_MSG_RESULT("$PLTHOME") - vi_cv_path_mzscheme_pfx="$PLTHOME" - else -- AC_MSG_RESULT("not set") -+ AC_MSG_RESULT(not set) - dnl -- try to find MzScheme executable - AC_PATH_PROG(vi_cv_path_mzscheme, mzscheme) - - dnl resolve symbolic link, the executable is often elsewhere and there - dnl are no links for the include files. -@@ -428,60 +444,85 @@ if test "$enable_mzschemeinterp" = "yes" - fi - - if test "X$vi_cv_path_mzscheme" != "X"; then - dnl -- find where MzScheme thinks it was installed - AC_CACHE_CHECK(MzScheme install prefix,vi_cv_path_mzscheme_pfx, -- [ vi_cv_path_mzscheme_pfx=` -- ${vi_cv_path_mzscheme} -evm \ -- "(display (simplify-path \ -+ dnl different versions of MzScheme differ in command line processing -+ dnl use universal approach -+ echo "(display (simplify-path \ - (build-path (call-with-values \ - (lambda () (split-path (find-system-path (quote exec-file)))) \ -- (lambda (base name must-be-dir?) base)) (quote up))))"` ]) -- dnl Remove a trailing slash. -- vi_cv_path_mzscheme_pfx=`echo "$vi_cv_path_mzscheme_pfx" | sed 's+/$++'` -+ (lambda (base name must-be-dir?) base)) (quote up))))" > mzdirs.scm -+ dnl Remove a trailing slash -+ [ vi_cv_path_mzscheme_pfx=`${vi_cv_path_mzscheme} -r mzdirs.scm | \ -+ sed -e 's+/$++'` ]) -+ rm -f mzdirs.scm - fi - fi - fi - - SCHEME_INC= - if test "X$vi_cv_path_mzscheme_pfx" != "X"; then - AC_MSG_CHECKING(if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include) - if test -f $vi_cv_path_mzscheme_pfx/include/scheme.h; then -- AC_MSG_RESULT("yes") -+ SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include -+ AC_MSG_RESULT(yes) - else -- AC_MSG_RESULT("no") -- AC_MSG_CHECKING(if scheme.h can be found in $vi_cv_path_mzscheme_pfx/plt/include) -+ AC_MSG_RESULT(no) -+ AC_MSG_CHECKING(if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include/plt) - if test -f $vi_cv_path_mzscheme_pfx/include/plt/scheme.h; then -- AC_MSG_RESULT("yes") -- SCHEME_INC=/plt -+ AC_MSG_RESULT(yes) -+ SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include/plt - else -- AC_MSG_RESULT("no") -- vi_cv_path_mzscheme_pfx= -+ AC_MSG_RESULT(no) -+ AC_MSG_CHECKING(if scheme.h can be found in /usr/include/plt/) -+ if test -f /usr/include/plt/scheme.h; then -+ AC_MSG_RESULT(yes) -+ SCHEME_INC=/usr/include/plt -+ else -+ AC_MSG_RESULT(no) -+ vi_cv_path_mzscheme_pfx= -+ fi - fi - fi - fi - - if test "X$vi_cv_path_mzscheme_pfx" != "X"; then - if test "x$MACOSX" = "xyes"; then - MZSCHEME_LIBS="-framework PLT_MzScheme" -+ elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"; then -+ MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a" -+ MZSCHEME_CFLAGS="-DMZ_PRECISE_GC" - elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"; then - MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a" - else -- MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc" -+ dnl Using shared objects -+ if test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.so"; then -+ MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme3m" -+ MZSCHEME_CFLAGS="-DMZ_PRECISE_GC" -+ else -+ MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc" -+ fi - if test "$GCC" = yes; then - dnl Make Vim remember the path to the library. For when it's not in - dnl $LD_LIBRARY_PATH. -- MZSCHEME_LIBS="$MZSCHEME_LIBS -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib" -+ MZSCHEME_LIBS="${MZSCHEME_LIBS} -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib" - elif test "`(uname) 2>/dev/null`" = SunOS && - uname -r | grep '^5' >/dev/null; then -- MZSCHEME_LIBS="$MZSCHEME_LIBS -R ${vi_cv_path_mzscheme_pfx}/lib" -+ MZSCHEME_LIBS="${MZSCHEME_LIBS} -R ${vi_cv_path_mzscheme_pfx}/lib" - fi - fi - if test -d $vi_cv_path_mzscheme_pfx/lib/plt/collects; then - SCHEME_COLLECTS=lib/plt/ - fi -- MZSCHEME_CFLAGS="-I${vi_cv_path_mzscheme_pfx}/include${SCHEME_INC} \ -+ if test -f "${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects/scheme/base.ss" ; then -+ dnl need to generate bytecode for MzScheme base -+ MZSCHEME_EXTRA="mzscheme_base.c" -+ MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -DINCLUDE_MZSCHEME_BASE" -+ MZSCHEME_MZC="${vi_cv_path_mzscheme_pfx}/bin/mzc" -+ fi -+ MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -I${SCHEME_INC} \ - -DMZSCHEME_COLLECTS='\"${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects\"'" - MZSCHEME_SRC="if_mzsch.c" - MZSCHEME_OBJ="objects/if_mzsch.o" - MZSCHEME_PRO="if_mzsch.pro" - AC_DEFINE(FEAT_MZSCHEME) -@@ -489,10 +530,12 @@ if test "$enable_mzschemeinterp" = "yes" - AC_SUBST(MZSCHEME_SRC) - AC_SUBST(MZSCHEME_OBJ) - AC_SUBST(MZSCHEME_PRO) - AC_SUBST(MZSCHEME_LIBS) - AC_SUBST(MZSCHEME_CFLAGS) -+ AC_SUBST(MZSCHEME_EXTRA) -+ AC_SUBST(MZSCHEME_MZC) - fi - - - AC_MSG_CHECKING(--enable-perlinterp argument) - AC_ARG_ENABLE(perlinterp, -@@ -657,11 +700,11 @@ if test "$enable_pythoninterp" = "yes"; - - AC_CACHE_CHECK(Python's configuration directory,vi_cv_path_python_conf, - [ - vi_cv_path_python_conf= - for path in "${vi_cv_path_python_pfx}" "${vi_cv_path_python_epfx}"; do -- for subdir in lib share; do -+ for subdir in lib64 lib share; do - d="${path}/${subdir}/python${vi_cv_var_python_version}/config" - if test -d "$d" && test -f "$d/config.c"; then - vi_cv_path_python_conf="$d" - fi - done -@@ -920,21 +963,31 @@ AC_MSG_CHECKING(--enable-rubyinterp argu - AC_ARG_ENABLE(rubyinterp, - [ --enable-rubyinterp Include Ruby interpreter.], , - [enable_rubyinterp="no"]) - AC_MSG_RESULT($enable_rubyinterp) - if test "$enable_rubyinterp" = "yes"; then -+ AC_MSG_CHECKING(--with-ruby-command argument) -+ AC_ARG_WITH(ruby-command, [ --with-ruby-command=RUBY name of the Ruby command (default: ruby)], -+ RUBY_CMD="$withval"; AC_MSG_RESULT($RUBY_CMD), -+ RUBY_CMD="ruby"; AC_MSG_RESULT(defaulting to $RUBY_CMD)) - AC_SUBST(vi_cv_path_ruby) -- AC_PATH_PROG(vi_cv_path_ruby, ruby) -+ AC_PATH_PROG(vi_cv_path_ruby, $RUBY_CMD) - if test "X$vi_cv_path_ruby" != "X"; then - AC_MSG_CHECKING(Ruby version) - if $vi_cv_path_ruby -e '(VERSION rescue RUBY_VERSION) >= "1.6.0" or exit 1' >/dev/null 2>/dev/null; then - AC_MSG_RESULT(OK) - AC_MSG_CHECKING(Ruby header files) -- rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG[["archdir"]] || $hdrdir' 2>/dev/null` -+ rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG[["rubyhdrdir"]] || Config::CONFIG[["archdir"]] || $hdrdir' 2>/dev/null` - if test "X$rubyhdrdir" != "X"; then - AC_MSG_RESULT($rubyhdrdir) - RUBY_CFLAGS="-I$rubyhdrdir" -+ rubyarch=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG[["arch"]]'` -+ if test -d "$rubyhdrdir/$rubyarch"; then -+ RUBY_CFLAGS="$RUBY_CFLAGS -I$rubyhdrdir/$rubyarch" -+ fi -+ rubyversion=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG[["ruby_version"]].gsub(/\./, "")[[0,2]]'` -+ RUBY_CFLAGS="$RUBY_CFLAGS -DRUBY_VERSION=$rubyversion" - rubylibs=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG[["LIBS"]]'` - if test "X$rubylibs" != "X"; then - RUBY_LIBS="$rubylibs" - fi - librubyarg=`$vi_cv_path_ruby -r rbconfig -e 'print Config.expand(Config::CONFIG[["LIBRUBYARG"]])'` -@@ -955,18 +1008,24 @@ if test "$enable_rubyinterp" = "yes"; th - if test "X$librubyarg" != "X"; then - RUBY_LIBS="$librubyarg $RUBY_LIBS" - fi - rubyldflags=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG[["LDFLAGS"]]'` - if test "X$rubyldflags" != "X"; then -- LDFLAGS="$rubyldflags $LDFLAGS" -+ dnl Ruby on Mac OS X 10.5 adds "-arch" flags but these should only -+ dnl be included if requested by passing --with-mac-arch to -+ dnl configure, so strip these flags first (if present) -+ rubyldflags=`echo "$rubyldflags" | sed -e 's/-arch\ ppc//' -e 's/-arch\ i386//'` -+ if test "X$rubyldflags" != "X"; then -+ LDFLAGS="$rubyldflags $LDFLAGS" -+ fi - fi - RUBY_SRC="if_ruby.c" - RUBY_OBJ="objects/if_ruby.o" - RUBY_PRO="if_ruby.pro" - AC_DEFINE(FEAT_RUBY) - else -- AC_MSG_RESULT(not found, disabling Ruby) -+ AC_MSG_RESULT(not found; disabling Ruby) - fi - else - AC_MSG_RESULT(too old; need Ruby version 1.6.0 or later) - fi - fi -@@ -1191,10 +1250,32 @@ else - ) - CFLAGS=$cflags_save - - LDFLAGS="$ac_save_LDFLAGS" - -+ AC_MSG_CHECKING(size of wchar_t is 2 bytes) -+ AC_CACHE_VAL(ac_cv_small_wchar_t, -+ [AC_TRY_RUN([ -+#include <X11/Xlib.h> -+#if STDC_HEADERS -+# include <stdlib.h> -+# include <stddef.h> -+#endif -+ main() -+ { -+ if (sizeof(wchar_t) <= 2) -+ exit(1); -+ exit(0); -+ }], -+ ac_cv_small_wchar_t="no", -+ ac_cv_small_wchar_t="yes", -+ AC_MSG_ERROR(failed to compile test program))]) -+ AC_MSG_RESULT($ac_cv_small_wchar_t) -+ if test "x$ac_cv_small_wchar_t" = "xyes" ; then -+ AC_DEFINE(SMALL_WCHAR_T) -+ fi -+ - fi - fi - - test "x$with_x" = xno -a "x$MACOSX" != "xyes" -a "x$QNX" != "xyes" && enable_gui=no - -@@ -2065,10 +2146,15 @@ fi - AC_MSG_CHECKING(whether __DATE__ and __TIME__ work) - AC_TRY_COMPILE([#include <stdio.h>], [printf("(" __DATE__ " " __TIME__ ")");], - AC_MSG_RESULT(yes); AC_DEFINE(HAVE_DATE_TIME), - AC_MSG_RESULT(no)) - -+AC_MSG_CHECKING(whether __attribute__((unused)) is allowed) -+AC_TRY_COMPILE([#include <stdio.h>], [int x __attribute__((unused));], -+ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_ATTRIBUTE_UNUSED), -+ AC_MSG_RESULT(no)) -+ - dnl Checks for header files. - AC_CHECK_HEADER(elf.h, HAS_ELF=1) - dnl AC_CHECK_HEADER(dwarf.h, SVR4=1) - if test "$HAS_ELF" = 1; then - AC_CHECK_LIB(elf, main) -@@ -2093,18 +2179,24 @@ AC_CHECK_HEADERS(stdarg.h stdlib.h strin - iconv.h langinfo.h math.h unistd.h stropts.h errno.h \ - sys/resource.h sys/systeminfo.h locale.h \ - sys/stream.h termios.h libc.h sys/statfs.h \ - poll.h sys/poll.h pwd.h utime.h sys/param.h libintl.h \ - libgen.h util/debug.h util/msg18n.h frame.h \ -- sys/acl.h sys/access.h sys/sysctl.h sys/sysinfo.h wchar.h wctype.h) -+ sys/acl.h sys/access.h sys/sysinfo.h wchar.h wctype.h) - - dnl sys/ptem.h depends on sys/stream.h on Solaris - AC_CHECK_HEADERS(sys/ptem.h, [], [], - [#if defined HAVE_SYS_STREAM_H - # include <sys/stream.h> - #endif]) - -+dnl sys/sysctl.h depends on sys/param.h on OpenBSD -+AC_CHECK_HEADERS(sys/sysctl.h, [], [], -+[#if defined HAVE_SYS_PARAM_H -+# include <sys/param.h> -+#endif]) -+ - - dnl pthread_np.h may exist but can only be used after including pthread.h - AC_MSG_CHECKING([for pthread_np.h]) - AC_TRY_COMPILE([ - #include <pthread.h> -@@ -2146,10 +2238,11 @@ CPPFLAGS=$cppflags_save - fi - - dnl Checks for typedefs, structures, and compiler characteristics. - AC_PROG_GCC_TRADITIONAL - AC_C_CONST -+AC_C_VOLATILE - AC_TYPE_MODE_T - AC_TYPE_OFF_T - AC_TYPE_PID_T - AC_TYPE_SIZE_T - AC_TYPE_UID_T -@@ -2488,15 +2581,15 @@ main() - vim_cv_tty_mode=0620 - fi - AC_MSG_RESULT([pty mode: $vim_cv_tty_mode, group: $vim_cv_tty_group]) - else - vim_cv_tty_group=world -- AC_MSG_RESULT([ptys are world accessable]) -+ AC_MSG_RESULT([ptys are world accessible]) - fi - ],[ - vim_cv_tty_group=world -- AC_MSG_RESULT([can't determine - assume ptys are world accessable]) -+ AC_MSG_RESULT([can't determine - assume ptys are world accessible]) - ],[ - AC_MSG_ERROR(cross-compiling: please set 'vim_cv_tty_group' and 'vim_cv_tty_mode') - ]) - ]) - rm -f conftest_grp -@@ -2563,18 +2656,20 @@ main() - - if test "x$vim_cv_getcwd_broken" = "xyes" ; then - AC_DEFINE(BAD_GETCWD) - fi - --dnl Check for functions in one big call, to reduce the size of configure --AC_CHECK_FUNCS(bcmp fchdir fchown fseeko fsync ftello getcwd getpseudotty \ -+dnl Check for functions in one big call, to reduce the size of configure. -+dnl Can only be used for functions that do not require any include. -+AC_CHECK_FUNCS(bcmp fchdir fchown fsync getcwd getpseudotty \ - getpwnam getpwuid getrlimit gettimeofday getwd lstat memcmp \ -- memset nanosleep opendir putenv qsort readlink select setenv \ -+ memset mkdtemp nanosleep opendir putenv qsort readlink select setenv \ - setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction \ - sigvec strcasecmp strerror strftime stricmp strncasecmp \ - strnicmp strpbrk strtol tgetent towlower towupper iswupper \ - usleep utime utimes) -+AC_FUNC_FSEEKO - - dnl fstatfs() can take 2 to 4 arguments, try to use st_blksize if possible - AC_MSG_CHECKING(for st_blksize) - AC_TRY_COMPILE( - [#include <sys/types.h> -@@ -2786,10 +2881,20 @@ if test "$enable_sysmouse" = "yes"; then - fi - else - AC_MSG_RESULT(yes) - fi - -+dnl make sure the FD_CLOEXEC flag for fcntl()'s F_SETFD command is known -+AC_MSG_CHECKING(for FD_CLOEXEC) -+AC_TRY_COMPILE( -+[#if HAVE_FCNTL_H -+# include <fcntl.h> -+#endif], -+[ int flag = FD_CLOEXEC;], -+ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_FD_CLOEXEC), -+ AC_MSG_RESULT(not usable)) -+ - dnl rename needs to be checked separately to work on Nextstep with cc - AC_MSG_CHECKING(for rename) - AC_TRY_LINK([#include <stdio.h>], [rename("this", "that")], - AC_MSG_RESULT(yes); AC_DEFINE(HAVE_RENAME), - AC_MSG_RESULT(no)) -@@ -2867,11 +2972,10 @@ main() - ac_cv_sizeof_int=0, - AC_MSG_ERROR(failed to compile test program))]) - AC_MSG_RESULT($ac_cv_sizeof_int) - AC_DEFINE_UNQUOTED(SIZEOF_INT, $ac_cv_sizeof_int) - -- - dnl Check for memmove() before bcopy(), makes memmove() be used when both are - dnl present, fixes problem with incompatibility between Solaris 2.4 and 2.5. - - [bcopy_test_prog=' - #include "confdefs.h" -@@ -2949,11 +3053,11 @@ dnl Find out if _Xsetlocale() is support - dnl Check if X_LOCALE should be defined. - - if test "$enable_multibyte" = "yes"; then - cflags_save=$CFLAGS - ldflags_save=$LDFLAGS -- if test -n "$x_includes" ; then -+ if test "x$x_includes" != "xNONE" ; then - CFLAGS="$CFLAGS -I$x_includes" - LDFLAGS="$X_LIBS $LDFLAGS -lX11" - AC_MSG_CHECKING(whether X_LOCALE needed) - AC_TRY_COMPILE([#include <X11/Xlocale.h>],, - AC_TRY_LINK_FUNC([_Xsetlocale], [AC_MSG_RESULT(yes) -@@ -2965,11 +3069,11 @@ if test "$enable_multibyte" = "yes"; the - fi - - dnl Link with xpg4, it is said to make Korean locale working - AC_CHECK_LIB(xpg4, _xpg4_setrunelocale, [LIBS="$LIBS -lxpg4"],,) - --dnl Check how we can run ctags -+dnl Check how we can run ctags. Default to "ctags" when nothing works. - dnl --version for Exuberant ctags (preferred) - dnl Add --fields=+S to get function signatures for omni completion. - dnl -t for typedefs (many ctags have this) - dnl -s for static functions (Elvis ctags only?) - dnl -v for variables. Dangerous, most ctags take this for 'vgrind style'. -@@ -2977,10 +3081,11 @@ dnl -i+m to test for older Exuberant cta - AC_MSG_CHECKING(how to create tags) - test -f tags && mv tags tags.save - if (eval ctags --version /dev/null | grep Exuberant) < /dev/null 1>&AC_FD_CC 2>&1; then - TAGPRG="ctags -I INIT+ --fields=+S" - else -+ TAGPRG="ctags" - (eval etags /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="etags" - (eval etags -c /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="etags -c" - (eval ctags /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="ctags" - (eval ctags -t /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="ctags -t" - (eval ctags -ts /dev/null) < /dev/null 1>&AC_FD_CC 2>&1 && TAGPRG="ctags -ts" -@@ -3142,30 +3247,38 @@ if test "x$MACOSX" = "xyes" && test "x$C - else - AC_MSG_RESULT(no) - fi - fi - if test "x$MACARCH" = "xboth"; then -- LDFLAGS="$LDFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" -+ LDFLAGS="$LDFLAGS -isysroot $DEVELOPER_DIR/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" - fi - - dnl gcc 3.1 changed the meaning of -MM. The only solution appears to be to - dnl use "-isystem" instead of "-I" for all non-Vim include dirs. - dnl But only when making dependencies, cproto and lint don't take "-isystem". - dnl Mac gcc returns "powerpc-apple-darwin8-gcc-4.0.1 (GCC)...", need to allow - dnl the number before the version number. --AC_MSG_CHECKING(for GCC 3 or later) - DEPEND_CFLAGS_FILTER= - if test "$GCC" = yes; then -+ AC_MSG_CHECKING(for GCC 3 or later) - gccmajor=`echo "$gccversion" | sed -e 's/^\([[1-9]]\)\..*$/\1/g'` - if test "$gccmajor" -gt "2"; then - DEPEND_CFLAGS_FILTER="| sed 's+-I */+-isystem /+g'" -+ AC_MSG_RESULT(yes) -+ else -+ AC_MSG_RESULT(no) -+ fi -+ dnl -D_FORTIFY_SOURCE=2 crashes Vim on strcpy(buf, "000") when buf is -+ dnl declared as char x[1] but actually longer. Introduced in gcc 4.0. -+ dnl Also remove duplicate _FORTIFY_SOURCE arguments. -+ AC_MSG_CHECKING(whether we need -D_FORTIFY_SOURCE=1) -+ if test "$gccmajor" -gt "3"; then -+ CFLAGS=`echo "$CFLAGS" | sed -e 's/-Wp,-D_FORTIFY_SOURCE=.//g' -e 's/-D_FORTIFY_SOURCE=.//g' -e 's/$/ -D_FORTIFY_SOURCE=1/'` -+ AC_MSG_RESULT(yes) -+ else -+ AC_MSG_RESULT(no) - fi --fi --if test "$DEPEND_CFLAGS_FILTER" = ""; then -- AC_MSG_RESULT(no) --else -- AC_MSG_RESULT(yes) - fi - AC_SUBST(DEPEND_CFLAGS_FILTER) - - dnl write output files - AC_OUTPUT(auto/config.mk:config.mk.in) ---- vim72.orig/src/diff.c -+++ vim72/src/diff.c -@@ -6,11 +6,11 @@ - * Do ":help credits" in Vim to see a list of people who contributed. - * See README.txt for an overview of the Vim source code. - */ - - /* -- * diff.c: code for diff'ing two or three buffers. -+ * diff.c: code for diff'ing two, three or four buffers. - */ - - #include "vim.h" - - #if defined(FEAT_DIFF) || defined(PROTO) -@@ -71,10 +71,12 @@ diff_buf_delete(buf) - i = diff_buf_idx_tp(buf, tp); - if (i != DB_COUNT) - { - tp->tp_diffbuf[i] = NULL; - tp->tp_diff_invalid = TRUE; -+ if (tp == curtab) -+ diff_redraw(TRUE); - } - } - } - - /* -@@ -100,10 +102,11 @@ diff_buf_adjust(win) - i = diff_buf_idx(win->w_buffer); - if (i != DB_COUNT) - { - curtab->tp_diffbuf[i] = NULL; - curtab->tp_diff_invalid = TRUE; -+ diff_redraw(TRUE); - } - } - } - else - diff_buf_add(win->w_buffer); -@@ -111,11 +114,11 @@ diff_buf_adjust(win) - - /* - * Add a buffer to make diffs for. - * Call this when a new buffer is being edited in the current window where - * 'diff' is set. -- * Marks the current buffer as being part of the diff and requireing updating. -+ * Marks the current buffer as being part of the diff and requiring updating. - * This must be done before any autocmd, because a command may use info - * about the screen contents. - */ - void - diff_buf_add(buf) -@@ -129,10 +132,11 @@ diff_buf_add(buf) - for (i = 0; i < DB_COUNT; ++i) - if (curtab->tp_diffbuf[i] == NULL) - { - curtab->tp_diffbuf[i] = buf; - curtab->tp_diff_invalid = TRUE; -+ diff_redraw(TRUE); - return; - } - - EMSGN(_("E96: Can not diff more than %ld buffers"), DB_COUNT); - } -@@ -646,23 +650,23 @@ diff_write(buf, fname) - * Completely update the diffs for the buffers involved. - * This uses the ordinary "diff" command. - * The buffers are written to a file, also for unmodified buffers (the file - * could have been produced by autocommands, e.g. the netrw plugin). - */ --/*ARGSUSED*/ - void - ex_diffupdate(eap) -- exarg_T *eap; /* can be NULL, it's not used */ -+ exarg_T *eap UNUSED; /* can be NULL */ - { - buf_T *buf; - int idx_orig; - int idx_new; - char_u *tmp_orig; - char_u *tmp_new; - char_u *tmp_diff; - FILE *fd; - int ok; -+ int io_error = FALSE; - - /* Delete all diffblocks. */ - diff_clear(curtab); - curtab->tp_diff_invalid = FALSE; - -@@ -695,22 +699,30 @@ ex_diffupdate(eap) - */ - for (;;) - { - ok = FALSE; - fd = mch_fopen((char *)tmp_orig, "w"); -- if (fd != NULL) -+ if (fd == NULL) -+ io_error = TRUE; -+ else - { -- fwrite("line1\n", (size_t)6, (size_t)1, fd); -+ if (fwrite("line1\n", (size_t)6, (size_t)1, fd) != 1) -+ io_error = TRUE; - fclose(fd); - fd = mch_fopen((char *)tmp_new, "w"); -- if (fd != NULL) -+ if (fd == NULL) -+ io_error = TRUE; -+ else - { -- fwrite("line2\n", (size_t)6, (size_t)1, fd); -+ if (fwrite("line2\n", (size_t)6, (size_t)1, fd) != 1) -+ io_error = TRUE; - fclose(fd); - diff_file(tmp_orig, tmp_new, tmp_diff); - fd = mch_fopen((char *)tmp_diff, "r"); -- if (fd != NULL) -+ if (fd == NULL) -+ io_error = TRUE; -+ else - { - char_u linebuf[LBUFLEN]; - - for (;;) - { -@@ -759,10 +771,12 @@ ex_diffupdate(eap) - if (ok) - break; - } - if (!ok) - { -+ if (io_error) -+ EMSG(_("E810: Cannot read or write temp files")); - EMSG(_("E97: Cannot create diffs")); - diff_a_works = MAYBE; - #if defined(MSWIN) || defined(MSDOS) - diff_bin_works = MAYBE; - #endif -@@ -810,40 +824,42 @@ diff_file(tmp_orig, tmp_new, tmp_diff) - char_u *tmp_orig; - char_u *tmp_new; - char_u *tmp_diff; - { - char_u *cmd; -+ size_t len; - - #ifdef FEAT_EVAL - if (*p_dex != NUL) - /* Use 'diffexpr' to generate the diff file. */ - eval_diff(tmp_orig, tmp_new, tmp_diff); - else - #endif - { -- cmd = alloc((unsigned)(STRLEN(tmp_orig) + STRLEN(tmp_new) -- + STRLEN(tmp_diff) + STRLEN(p_srr) + 27)); -+ len = STRLEN(tmp_orig) + STRLEN(tmp_new) -+ + STRLEN(tmp_diff) + STRLEN(p_srr) + 27; -+ cmd = alloc((unsigned)len); - if (cmd != NULL) - { - /* We don't want $DIFF_OPTIONS to get in the way. */ - if (getenv("DIFF_OPTIONS")) - vim_setenv((char_u *)"DIFF_OPTIONS", (char_u *)""); - - /* Build the diff command and execute it. Always use -a, binary - * differences are of no use. Ignore errors, diff returns - * non-zero when differences have been found. */ -- sprintf((char *)cmd, "diff %s%s%s%s%s %s", -+ vim_snprintf((char *)cmd, len, "diff %s%s%s%s%s %s", - diff_a_works == FALSE ? "" : "-a ", - #if defined(MSWIN) || defined(MSDOS) - diff_bin_works == TRUE ? "--binary " : "", - #else - "", - #endif - (diff_flags & DIFF_IWHITE) ? "-b " : "", - (diff_flags & DIFF_ICASE) ? "-i " : "", - tmp_orig, tmp_new); -- append_redir(cmd, p_srr, tmp_diff); -+ append_redir(cmd, (int)len, p_srr, tmp_diff); - #ifdef FEAT_AUTOCMD - block_autocmds(); /* Avoid ShellCmdPost stuff */ - #endif - (void)call_shell(cmd, SHELL_FILTER|SHELL_SILENT|SHELL_DOOUT); - #ifdef FEAT_AUTOCMD -@@ -864,20 +880,22 @@ ex_diffpatch(eap) - exarg_T *eap; - { - char_u *tmp_orig; /* name of original temp file */ - char_u *tmp_new; /* name of patched temp file */ - char_u *buf = NULL; -+ size_t buflen; - win_T *old_curwin = curwin; - char_u *newname = NULL; /* name of patched file buffer */ - #ifdef UNIX - char_u dirbuf[MAXPATHL]; - char_u *fullname = NULL; - #endif - #ifdef FEAT_BROWSE - char_u *browseFile = NULL; - int browse_flag = cmdmod.browse; - #endif -+ struct stat st; - - #ifdef FEAT_BROWSE - if (cmdmod.browse) - { - browseFile = do_browse(0, (char_u *)_("Patch file"), -@@ -903,34 +921,35 @@ ex_diffpatch(eap) - - #ifdef UNIX - /* Get the absolute path of the patchfile, changing directory below. */ - fullname = FullName_save(eap->arg, FALSE); - #endif -- buf = alloc((unsigned)(STRLEN(tmp_orig) + ( -+ buflen = STRLEN(tmp_orig) + ( - # ifdef UNIX - fullname != NULL ? STRLEN(fullname) : - # endif -- STRLEN(eap->arg)) + STRLEN(tmp_new) + 16)); -+ STRLEN(eap->arg)) + STRLEN(tmp_new) + 16; -+ buf = alloc((unsigned)buflen); - if (buf == NULL) - goto theend; - - #ifdef UNIX -- /* Temporaraly chdir to /tmp, to avoid patching files in the current -+ /* Temporarily chdir to /tmp, to avoid patching files in the current - * directory when the patch file contains more than one patch. When we - * have our own temp dir use that instead, it will be cleaned up when we - * exit (any .rej files created). Don't change directory if we can't - * return to the current. */ - if (mch_dirname(dirbuf, MAXPATHL) != OK || mch_chdir((char *)dirbuf) != 0) - dirbuf[0] = NUL; - else - { - # ifdef TEMPDIRNAMES - if (vim_tempdir != NULL) -- mch_chdir((char *)vim_tempdir); -+ ignored = mch_chdir((char *)vim_tempdir); - else - # endif -- mch_chdir("/tmp"); -+ ignored = mch_chdir("/tmp"); - shorten_fnames(TRUE); - } - #endif - - #ifdef FEAT_EVAL -@@ -944,11 +963,12 @@ ex_diffpatch(eap) - else - #endif - { - /* Build the patch command and execute it. Ignore errors. Switch to - * cooked mode to allow the user to respond to prompts. */ -- sprintf((char *)buf, "patch -o %s %s < \"%s\"", tmp_new, tmp_orig, -+ vim_snprintf((char *)buf, buflen, "patch -o %s %s < \"%s\"", -+ tmp_new, tmp_orig, - # ifdef UNIX - fullname != NULL ? fullname : - # endif - eap->arg); - #ifdef FEAT_AUTOCMD -@@ -978,48 +998,55 @@ ex_diffpatch(eap) - mch_remove(buf); - STRCPY(buf, tmp_new); - STRCAT(buf, ".rej"); - mch_remove(buf); - -- if (curbuf->b_fname != NULL) -+ /* Only continue if the output file was created. */ -+ if (mch_stat((char *)tmp_new, &st) < 0 || st.st_size == 0) -+ EMSG(_("E816: Cannot read patch output")); -+ else - { -- newname = vim_strnsave(curbuf->b_fname, -+ if (curbuf->b_fname != NULL) -+ { -+ newname = vim_strnsave(curbuf->b_fname, - (int)(STRLEN(curbuf->b_fname) + 4)); -- if (newname != NULL) -- STRCAT(newname, ".new"); -- } -+ if (newname != NULL) -+ STRCAT(newname, ".new"); -+ } - - #ifdef FEAT_GUI -- need_mouse_correct = TRUE; -+ need_mouse_correct = TRUE; - #endif -- /* don't use a new tab page, each tab page has its own diffs */ -- cmdmod.tab = 0; -- -- if (win_split(0, (diff_flags & DIFF_VERTICAL) ? WSP_VERT : 0) != FAIL) -- { -- /* Pretend it was a ":split fname" command */ -- eap->cmdidx = CMD_split; -- eap->arg = tmp_new; -- do_exedit(eap, old_curwin); -+ /* don't use a new tab page, each tab page has its own diffs */ -+ cmdmod.tab = 0; - -- if (curwin != old_curwin) /* split must have worked */ -+ if (win_split(0, (diff_flags & DIFF_VERTICAL) ? WSP_VERT : 0) != FAIL) - { -- /* Set 'diff', 'scrollbind' on and 'wrap' off. */ -- diff_win_options(curwin, TRUE); -- diff_win_options(old_curwin, TRUE); -+ /* Pretend it was a ":split fname" command */ -+ eap->cmdidx = CMD_split; -+ eap->arg = tmp_new; -+ do_exedit(eap, old_curwin); - -- if (newname != NULL) -+ /* check that split worked and editing tmp_new */ -+ if (curwin != old_curwin && win_valid(old_curwin)) - { -- /* do a ":file filename.new" on the patched buffer */ -- eap->arg = newname; -- ex_file(eap); -+ /* Set 'diff', 'scrollbind' on and 'wrap' off. */ -+ diff_win_options(curwin, TRUE); -+ diff_win_options(old_curwin, TRUE); -+ -+ if (newname != NULL) -+ { -+ /* do a ":file filename.new" on the patched buffer */ -+ eap->arg = newname; -+ ex_file(eap); - - #ifdef FEAT_AUTOCMD -- /* Do filetype detection with the new name. */ -- if (au_has_group((char_u *)"filetypedetect")) -- do_cmdline_cmd((char_u *)":doau filetypedetect BufRead"); -+ /* Do filetype detection with the new name. */ -+ if (au_has_group((char_u *)"filetypedetect")) -+ do_cmdline_cmd((char_u *)":doau filetypedetect BufRead"); - #endif -+ } - } - } - } - - theend: -@@ -1072,14 +1099,13 @@ ex_diffsplit(eap) - } - - /* - * Set options to show difs for the current window. - */ --/*ARGSUSED*/ - void - ex_diffthis(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - /* Set 'diff', 'scrollbind' on and 'wrap' off. */ - diff_win_options(curwin, TRUE); - } - -@@ -1089,30 +1115,35 @@ ex_diffthis(eap) - void - diff_win_options(wp, addbuf) - win_T *wp; - int addbuf; /* Add buffer to diff. */ - { -+# ifdef FEAT_FOLDING -+ win_T *old_curwin = curwin; -+ -+ /* close the manually opened folds */ -+ curwin = wp; -+ newFoldLevel(); -+ curwin = old_curwin; -+# endif -+ - wp->w_p_diff = TRUE; - wp->w_p_scb = TRUE; - wp->w_p_wrap = FALSE; - # ifdef FEAT_FOLDING -- { -- win_T *old_curwin = curwin; -- -- curwin = wp; -- curbuf = curwin->w_buffer; -- set_string_option_direct((char_u *)"fdm", -1, (char_u *)"diff", -+ curwin = wp; -+ curbuf = curwin->w_buffer; -+ set_string_option_direct((char_u *)"fdm", -1, (char_u *)"diff", - OPT_LOCAL|OPT_FREE, 0); -- curwin = old_curwin; -- curbuf = curwin->w_buffer; -- wp->w_p_fdc = diff_foldcolumn; -- wp->w_p_fen = TRUE; -- wp->w_p_fdl = 0; -- foldUpdateAll(wp); -- /* make sure topline is not halfway a fold */ -- changed_window_setting_win(wp); -- } -+ curwin = old_curwin; -+ curbuf = curwin->w_buffer; -+ wp->w_p_fdc = diff_foldcolumn; -+ wp->w_p_fen = TRUE; -+ wp->w_p_fdl = 0; -+ foldUpdateAll(wp); -+ /* make sure topline is not halfway a fold */ -+ changed_window_setting_win(wp); - # endif - #ifdef FEAT_SCROLLBIND - if (vim_strchr(p_sbo, 'h') == NULL) - do_cmdline_cmd((char_u *)"set sbo+=hor"); - #endif -@@ -1136,11 +1167,11 @@ ex_diffoff(eap) - int diffwin = FALSE; - #endif - - for (wp = firstwin; wp != NULL; wp = wp->w_next) - { -- if (wp == curwin || eap->forceit) -+ if (wp == curwin || (eap->forceit && wp->w_p_diff)) - { - /* Set 'diff', 'scrollbind' off and 'wrap' on. */ - wp->w_p_diff = FALSE; - wp->w_p_scb = FALSE; - wp->w_p_wrap = TRUE; -@@ -2112,10 +2143,12 @@ ex_diffgetput(eap) - if (buf == NULL) - { - EMSG2(_("E102: Can't find buffer \"%s\""), eap->arg); - return; - } -+ if (buf == curbuf) -+ return; /* nothing to do */ - idx_other = diff_buf_idx(buf); - if (idx_other == DB_COUNT) - { - EMSG2(_("E103: Buffer \"%s\" is not in diff mode"), eap->arg); - return; ---- vim72.orig/src/digraph.c -+++ vim72/src/digraph.c -@@ -30,11 +30,11 @@ typedef struct digraph - - static int getexactdigraph __ARGS((int, int, int)); - static void printdigraph __ARGS((digr_T *)); - - /* digraphs added by the user */ --static garray_T user_digraphs = {0, 0, sizeof(digr_T), 10, NULL}; -+static garray_T user_digraphs = {0, 0, (int)sizeof(digr_T), 10, NULL}; - - /* - * Note: Characters marked with XX are not included literally, because some - * compilers cannot handle them (Amiga SAS/C is the most picky one). - */ -@@ -2369,14 +2369,14 @@ printdigraph(dp) - *p++ = ' '; - p += (*mb_char2bytes)(dp->result, p); - } - else - #endif -- *p++ = dp->result; -+ *p++ = (char_u)dp->result; - if (char2cells(dp->result) == 1) - *p++ = ' '; -- sprintf((char *)p, " %3d", dp->result); -+ vim_snprintf((char *)p, sizeof(buf) - (p - buf), " %3d", dp->result); - msg_outtrans(buf); - } - } - - #endif /* FEAT_DIGRAPHS */ -@@ -2393,11 +2393,14 @@ typedef struct - #define KMAP_MAXLEN 20 /* maximum length of "from" or "to" */ - - static void keymap_unload __ARGS((void)); - - /* -- * Set up key mapping tables for the 'keymap' option -+ * Set up key mapping tables for the 'keymap' option. -+ * Returns NULL if OK, an error message for failure. This only needs to be -+ * used when setting the option, not later when the value has already been -+ * checked. - */ - char_u * - keymap_init() - { - curbuf->b_kmap_state &= ~KEYMAP_INIT; -@@ -2410,29 +2413,33 @@ keymap_init() - do_cmdline_cmd((char_u *)"unlet! b:keymap_name"); - } - else - { - char_u *buf; -+ size_t buflen; - - /* Source the keymap file. It will contain a ":loadkeymap" command - * which will call ex_loadkeymap() below. */ -- buf = alloc((unsigned)(STRLEN(curbuf->b_p_keymap) -+ buflen = STRLEN(curbuf->b_p_keymap) - # ifdef FEAT_MBYTE -- + STRLEN(p_enc) -+ + STRLEN(p_enc) - # endif -- + 14)); -+ + 14; -+ buf = alloc((unsigned)buflen); - if (buf == NULL) - return e_outofmem; - - # ifdef FEAT_MBYTE - /* try finding "keymap/'keymap'_'encoding'.vim" in 'runtimepath' */ -- sprintf((char *)buf, "keymap/%s_%s.vim", curbuf->b_p_keymap, p_enc); -+ vim_snprintf((char *)buf, buflen, "keymap/%s_%s.vim", -+ curbuf->b_p_keymap, p_enc); - if (source_runtime(buf, FALSE) == FAIL) - # endif - { - /* try finding "keymap/'keymap'.vim" in 'runtimepath' */ -- sprintf((char *)buf, "keymap/%s.vim", curbuf->b_p_keymap); -+ vim_snprintf((char *)buf, buflen, "keymap/%s.vim", -+ curbuf->b_p_keymap); - if (source_runtime(buf, FALSE) == FAIL) - { - vim_free(buf); - return (char_u *)N_("E544: Keymap file not found"); - } ---- vim72.orig/src/edit.c -+++ vim72/src/edit.c -@@ -55,11 +55,11 @@ static char *ctrl_x_msgs[] = - N_(" Omni completion (^O^N^P)"), - N_(" Spelling suggestion (s^N^P)"), - N_(" Keyword Local completion (^N^P)"), - }; - --static char_u e_hitend[] = N_("Hit end of paragraph"); -+static char e_hitend[] = N_("Hit end of paragraph"); - - /* - * Structure used to store one match for insert completion. - */ - typedef struct compl_S compl_T; -@@ -112,10 +112,14 @@ static int compl_restarting = FALSE; / - - /* When the first completion is done "compl_started" is set. When it's - * FALSE the word to be completed must be located. */ - static int compl_started = FALSE; - -+/* Set when doing something for completion that may call edit() recursively, -+ * which is not allowed. */ -+static int compl_busy = FALSE; -+ - static int compl_matches = 0; - static char_u *compl_pattern = NULL; - static int compl_direction = FORWARD; - static int compl_shows_dir = FORWARD; - static int compl_pending = 0; /* > 1 for postponed CTRL-N */ -@@ -145,10 +149,11 @@ static char_u *find_line_end __ARGS((cha - static void ins_compl_free __ARGS((void)); - static void ins_compl_clear __ARGS((void)); - static int ins_compl_bs __ARGS((void)); - static void ins_compl_new_leader __ARGS((void)); - static void ins_compl_addleader __ARGS((int c)); -+static int ins_compl_len __ARGS((void)); - static void ins_compl_restart __ARGS((void)); - static void ins_compl_set_original_text __ARGS((char_u *str)); - static void ins_compl_addfrommatch __ARGS((void)); - static int ins_compl_prep __ARGS((int c)); - static buf_T *ins_compl_next_buf __ARGS((buf_T *buf, int flag)); -@@ -162,11 +167,11 @@ static int ins_compl_next __ARGS((int a - static int ins_compl_key2dir __ARGS((int c)); - static int ins_compl_pum_key __ARGS((int c)); - static int ins_compl_key2count __ARGS((int c)); - static int ins_compl_use_match __ARGS((int c)); - static int ins_complete __ARGS((int c)); --static int quote_meta __ARGS((char_u *dest, char_u *str, int len)); -+static unsigned quote_meta __ARGS((char_u *dest, char_u *str, int len)); - #endif /* FEAT_INS_EXPAND */ - - #define BACKSPACE_CHAR 1 - #define BACKSPACE_WORD 2 - #define BACKSPACE_WORD_NOT_SPACE 3 -@@ -174,11 +179,11 @@ static int quote_meta __ARGS((char_u *d - - static void ins_redraw __ARGS((int ready)); - static void ins_ctrl_v __ARGS((void)); - static void undisplay_dollar __ARGS((void)); - static void insert_special __ARGS((int, int, int)); --static void internal_format __ARGS((int textwidth, int second_indent, int flags, int format_only)); -+static void internal_format __ARGS((int textwidth, int second_indent, int flags, int format_only, int c)); - static void check_auto_format __ARGS((int)); - static void redo_literal __ARGS((int c)); - static void start_arrow __ARGS((pos_T *end_insert_pos)); - #ifdef FEAT_SPELL - static void check_spell_redraw __ARGS((void)); -@@ -195,11 +200,12 @@ static void replace_join __ARGS((int off - static void replace_pop_ins __ARGS((void)); - #ifdef FEAT_MBYTE - static void mb_replace_pop_ins __ARGS((int cc)); - #endif - static void replace_flush __ARGS((void)); --static void replace_do_bs __ARGS((void)); -+static void replace_do_bs __ARGS((int limit_col)); -+static int del_char_after_col __ARGS((int limit_col)); - #ifdef FEAT_CINDENT - static int cindent_on __ARGS((void)); - #endif - static void ins_reg __ARGS((void)); - static void ins_ctrl_g __ARGS((void)); -@@ -302,11 +308,11 @@ edit(cmdchar, startln, count) - long count; - { - int c = 0; - char_u *ptr; - int lastc; -- colnr_T mincol; -+ int mincol; - static linenr_T o_lnum = 0; - int i; - int did_backspace = TRUE; /* previous char was backspace */ - #ifdef FEAT_CINDENT - int line_is_white = FALSE; /* line is empty before insert */ -@@ -342,11 +348,11 @@ edit(cmdchar, startln, count) - return FALSE; - } - - #ifdef FEAT_INS_EXPAND - /* Don't allow recursive insert mode when busy with completion. */ -- if (compl_started || pum_visible()) -+ if (compl_started || compl_busy || pum_visible()) - { - EMSG(_(e_secure)); - return FALSE; - } - ins_compl_clear(); /* clear stuff for CTRL-X mode */ -@@ -383,11 +389,11 @@ edit(cmdchar, startln, count) - { - Insstart = curwin->w_cursor; - if (startln) - Insstart.col = 0; - } -- Insstart_textlen = linetabsize(ml_get_curline()); -+ Insstart_textlen = (colnr_T)linetabsize(ml_get_curline()); - Insstart_blank_vcol = MAXCOL; - if (!did_ai) - ai_col = 0; - - if (cmdchar != NUL && restart_edit == 0) -@@ -649,11 +655,11 @@ edit(cmdchar, startln, count) - ) - { - mincol = curwin->w_wcol; - validate_cursor_col(); - -- if ((int)curwin->w_wcol < (int)mincol - curbuf->b_p_ts -+ if ((int)curwin->w_wcol < mincol - curbuf->b_p_ts - && curwin->w_wrow == W_WINROW(curwin) - + curwin->w_height - 1 - p_so - && (curwin->w_cursor.lnum != curwin->w_topline - #ifdef FEAT_DIFF - || curwin->w_topfill > 0 -@@ -749,11 +755,11 @@ edit(cmdchar, startln, count) - /* CTRL-L: Add one character from the current match to - * "compl_leader". Except when at the original match and - * there is nothing to add, CTRL-L works like CTRL-P then. */ - if (c == Ctrl_L - && (ctrl_x_mode != CTRL_X_WHOLE_LINE -- || STRLEN(compl_shown_match->cp_str) -+ || (int)STRLEN(compl_shown_match->cp_str) - > curwin->w_cursor.col - compl_col)) - { - ins_compl_addfrommatch(); - continue; - } -@@ -1336,12 +1342,14 @@ doESCkey: - && ctrl_x_mode != 0 - && !(compl_cont_status & CONT_LOCAL)) - goto normalchar; - - docomplete: -+ compl_busy = TRUE; - if (ins_complete(c) == FAIL) - compl_cont_status = 0; -+ compl_busy = FALSE; - break; - #endif /* FEAT_INS_EXPAND */ - - case Ctrl_Y: /* copy from previous line or scroll down */ - case Ctrl_E: /* copy from next line or scroll up */ -@@ -1439,14 +1447,13 @@ force_cindent: - * This is postponed until getting the next character to make '$' in the 'cpo' - * option work correctly. - * Only redraw when there are no characters available. This speeds up - * inserting sequences of characters (e.g., for CTRL-R). - */ --/*ARGSUSED*/ - static void - ins_redraw(ready) -- int ready; /* not busy with something */ -+ int ready UNUSED; /* not busy with something */ - { - if (!char_avail()) - { - #ifdef FEAT_AUTOCMD - /* Trigger CursorMoved if the cursor moved. Not when the popup menu is -@@ -1769,11 +1776,11 @@ change_indent(type, amount, round, repla - { - /* - * Compute the screen column where the cursor should be. - */ - vcol = get_indent() - vcol; -- curwin->w_virtcol = (vcol < 0) ? 0 : vcol; -+ curwin->w_virtcol = (colnr_T)((vcol < 0) ? 0 : vcol); - - /* - * Advance the cursor until we reach the right screen column. - */ - vcol = last_vcol = 0; -@@ -1796,13 +1803,13 @@ change_indent(type, amount, round, repla - * May need to insert spaces to be able to position the cursor on - * the right screen column. - */ - if (vcol != (int)curwin->w_virtcol) - { -- curwin->w_cursor.col = new_cursor_col; -+ curwin->w_cursor.col = (colnr_T)new_cursor_col; - i = (int)curwin->w_virtcol - vcol; -- ptr = alloc(i + 1); -+ ptr = alloc((unsigned)(i + 1)); - if (ptr != NULL) - { - new_cursor_col += i; - ptr[i] = NUL; - while (--i >= 0) -@@ -1822,11 +1829,11 @@ change_indent(type, amount, round, repla - curwin->w_p_list = save_p_list; - - if (new_cursor_col <= 0) - curwin->w_cursor.col = 0; - else -- curwin->w_cursor.col = new_cursor_col; -+ curwin->w_cursor.col = (colnr_T)new_cursor_col; - curwin->w_set_curswant = TRUE; - changed_cline_bef_curs(); - - /* - * May have to adjust the start of the insert. -@@ -1931,26 +1938,64 @@ truncate_spaces(line) - #if defined(FEAT_VREPLACE) || defined(FEAT_INS_EXPAND) \ - || defined(FEAT_COMMENTS) || defined(PROTO) - /* - * Backspace the cursor until the given column. Handles REPLACE and VREPLACE - * modes correctly. May also be used when not in insert mode at all. -+ * Will attempt not to go before "col" even when there is a composing -+ * character. - */ - void - backspace_until_column(col) - int col; - { - while ((int)curwin->w_cursor.col > col) - { - curwin->w_cursor.col--; - if (State & REPLACE_FLAG) -- replace_do_bs(); -- else -- (void)del_char(FALSE); -+ replace_do_bs(col); -+ else if (!del_char_after_col(col)) -+ break; - } - } - #endif - -+/* -+ * Like del_char(), but make sure not to go before column "limit_col". -+ * Only matters when there are composing characters. -+ * Return TRUE when something was deleted. -+ */ -+ static int -+del_char_after_col(limit_col) -+ int limit_col UNUSED; -+{ -+#ifdef FEAT_MBYTE -+ if (enc_utf8 && limit_col >= 0) -+ { -+ colnr_T ecol = curwin->w_cursor.col + 1; -+ -+ /* Make sure the cursor is at the start of a character, but -+ * skip forward again when going too far back because of a -+ * composing character. */ -+ mb_adjust_cursor(); -+ while (curwin->w_cursor.col < (colnr_T)limit_col) -+ { -+ int l = utf_ptr2len(ml_get_cursor()); -+ -+ if (l == 0) /* end of line */ -+ break; -+ curwin->w_cursor.col += l; -+ } -+ if (*ml_get_cursor() == NUL || curwin->w_cursor.col == ecol) -+ return FALSE; -+ del_bytes((long)((int)ecol - curwin->w_cursor.col), FALSE, TRUE); -+ } -+ else -+#endif -+ (void)del_char(FALSE); -+ return TRUE; -+} -+ - #if defined(FEAT_INS_EXPAND) || defined(PROTO) - /* - * CTRL-X pressed in Insert mode. - */ - static void -@@ -2117,11 +2162,11 @@ ins_compl_add_infercase(str, len, icase, - { - char_u *p; - int i, c; - int actual_len; /* Take multi-byte characters */ - int actual_compl_length; /* into account. */ -- int *wca; /* Wide character array. */ -+ int *wca; /* Wide character array. */ - int has_lower = FALSE; - int was_letter = FALSE; - - if (p_ic && curbuf->b_p_inf && len > 0) - { -@@ -2158,11 +2203,11 @@ ins_compl_add_infercase(str, len, icase, - else - #endif - actual_compl_length = compl_length; - - /* Allocate wide character array for the completion and fill it. */ -- wca = (int *)alloc(actual_len * sizeof(int)); -+ wca = (int *)alloc((unsigned)(actual_len * sizeof(int))); - if (wca != NULL) - { - p = str; - for (i = 0; i < actual_len; ++i) - #ifdef FEAT_MBYTE -@@ -2416,11 +2461,11 @@ ins_compl_longest_match(match) - compl_leader = vim_strsave(match->cp_str); - if (compl_leader != NULL) - { - had_match = (curwin->w_cursor.col > compl_col); - ins_compl_delete(); -- ins_bytes(compl_leader + curwin->w_cursor.col - compl_col); -+ ins_bytes(compl_leader + ins_compl_len()); - ins_redraw(FALSE); - - /* When the match isn't there (to avoid matching itself) remove it - * again after redrawing. */ - if (!had_match) -@@ -2468,11 +2513,11 @@ ins_compl_longest_match(match) - { - /* Leader was shortened, need to change the inserted text. */ - *p = NUL; - had_match = (curwin->w_cursor.col > compl_col); - ins_compl_delete(); -- ins_bytes(compl_leader + curwin->w_cursor.col - compl_col); -+ ins_bytes(compl_leader + ins_compl_len()); - ins_redraw(FALSE); - - /* When the match isn't there (to avoid matching itself) remove it - * again after redrawing. */ - if (!had_match) -@@ -2537,25 +2582,25 @@ ins_compl_make_cyclic() - * "startcol" is where the matched text starts (1 is first column). - * "list" is the list of matches. - */ - void - set_completion(startcol, list) -- int startcol; -+ colnr_T startcol; - list_T *list; - { - /* If already doing completions stop it. */ - if (ctrl_x_mode != 0) - ins_compl_prep(' '); - ins_compl_clear(); - - if (stop_arrow() == FAIL) - return; - -- if (startcol > (int)curwin->w_cursor.col) -+ if (startcol > curwin->w_cursor.col) - startcol = curwin->w_cursor.col; - compl_col = startcol; -- compl_length = curwin->w_cursor.col - startcol; -+ compl_length = (int)curwin->w_cursor.col - (int)startcol; - /* compl_pattern doesn't need to be set */ - compl_orig_text = vim_strnsave(ml_get_curline() + compl_col, compl_length); - if (compl_orig_text == NULL || ins_compl_add(compl_orig_text, - -1, p_ic, NULL, NULL, 0, ORIGINAL_TEXT, FALSE) != OK) - return; -@@ -2817,11 +2862,10 @@ ins_compl_dictionaries(dict_start, pat, - char_u *ptr; - char_u *buf; - regmatch_T regmatch; - char_u **files; - int count; -- int i; - int save_p_scs; - int dir = compl_direction; - - if (*dict == NUL) - { -@@ -2849,21 +2893,22 @@ ins_compl_dictionaries(dict_start, pat, - * to only match at the start of a line. Otherwise just match the - * pattern. Also need to double backslashes. */ - if (ctrl_x_mode == CTRL_X_WHOLE_LINE) - { - char_u *pat_esc = vim_strsave_escaped(pat, (char_u *)"\\"); -+ size_t len; - - if (pat_esc == NULL) - goto theend; -- i = (int)STRLEN(pat_esc) + 10; -- ptr = alloc(i); -+ len = STRLEN(pat_esc) + 10; -+ ptr = alloc((unsigned)len); - if (ptr == NULL) - { - vim_free(pat_esc); - goto theend; - } -- vim_snprintf((char *)ptr, i, "^\\s*\\zs\\V%s", pat_esc); -+ vim_snprintf((char *)ptr, len, "^\\s*\\zs\\V%s", pat_esc); - regmatch.regprog = vim_regcomp(ptr, RE_MAGIC); - vim_free(pat_esc); - vim_free(ptr); - } - else -@@ -2950,11 +2995,11 @@ ins_compl_files(count, files, thesaurus, - fp = mch_fopen((char *)files[i], "r"); /* open dictionary file */ - if (flags != DICT_EXACT) - { - vim_snprintf((char *)IObuff, IOSIZE, - _("Scanning dictionary: %s"), (char *)files[i]); -- msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R)); -+ (void)msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R)); - } - - if (fp != NULL) - { - /* -@@ -3131,10 +3176,11 @@ ins_compl_free() - for (i = 0; i < CPT_COUNT; ++i) - vim_free(match->cp_text[i]); - vim_free(match); - } while (compl_curr_match != NULL && compl_curr_match != compl_first_match); - compl_first_match = compl_curr_match = NULL; -+ compl_shown_match = NULL; - } - - static void - ins_compl_clear() - { -@@ -3207,11 +3253,11 @@ ins_compl_bs() - static void - ins_compl_new_leader() - { - ins_compl_del_pum(); - ins_compl_delete(); -- ins_bytes(compl_leader + curwin->w_cursor.col - compl_col); -+ ins_bytes(compl_leader + ins_compl_len()); - compl_used_match = FALSE; - - if (compl_started) - ins_compl_set_original_text(compl_leader); - else -@@ -3262,10 +3308,24 @@ ins_compl_new_leader() - if (compl_match_array == NULL) - compl_enter_selects = FALSE; - } - - /* -+ * Return the length of the completion, from the completion start column to -+ * the cursor column. Making sure it never goes below zero. -+ */ -+ static int -+ins_compl_len() -+{ -+ int off = (int)curwin->w_cursor.col - (int)compl_col; -+ -+ if (off < 0) -+ return 0; -+ return off; -+} -+ -+/* - * Append one character to the match leader. May reduce the number of - * matches. - */ - static void - ins_compl_addleader(c) -@@ -3290,11 +3350,11 @@ ins_compl_addleader(c) - if (compl_was_interrupted) - ins_compl_restart(); - - vim_free(compl_leader); - compl_leader = vim_strnsave(ml_get_curline() + compl_col, -- curwin->w_cursor.col - compl_col); -+ (int)(curwin->w_cursor.col - compl_col)); - if (compl_leader != NULL) - ins_compl_new_leader(); - } - - /* -@@ -3338,11 +3398,11 @@ ins_compl_set_original_text(str) - */ - static void - ins_compl_addfrommatch() - { - char_u *p; -- int len = curwin->w_cursor.col - compl_col; -+ int len = (int)curwin->w_cursor.col - (int)compl_col; - int c; - compl_T *cp; - - p = compl_shown_match->cp_str; - if ((int)STRLEN(p) <= len) /* the match is too short */ -@@ -3619,14 +3679,13 @@ ins_compl_prep(c) - /* CTRL-E means completion is Ended, go back to the typed text. */ - if (c == Ctrl_E) - { - ins_compl_delete(); - if (compl_leader != NULL) -- ins_bytes(compl_leader + curwin->w_cursor.col - compl_col); -+ ins_bytes(compl_leader + ins_compl_len()); - else if (compl_first_match != NULL) -- ins_bytes(compl_orig_text -- + curwin->w_cursor.col - compl_col); -+ ins_bytes(compl_orig_text + ins_compl_len()); - retval = TRUE; - } - - auto_format(FALSE, TRUE); - -@@ -3905,11 +3964,11 @@ ins_compl_get_exp(ini) - ins_buf->b_fname == NULL - ? buf_spname(ins_buf) - : ins_buf->b_sfname == NULL - ? (char *)ins_buf->b_fname - : (char *)ins_buf->b_sfname); -- msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R)); -+ (void)msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R)); - } - else if (*e_cpt == NUL) - break; - else - { -@@ -3934,12 +3993,12 @@ ins_compl_get_exp(ini) - type = CTRL_X_PATH_DEFINES; - #endif - else if (*e_cpt == ']' || *e_cpt == 't') - { - type = CTRL_X_TAGS; -- sprintf((char*)IObuff, _("Scanning tags.")); -- msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R)); -+ vim_snprintf((char *)IObuff, IOSIZE, _("Scanning tags.")); -+ (void)msg_trunc_attr(IObuff, TRUE, hl_attr(HLF_R)); - } - else - type = -1; - - /* in any case e_cpt is advanced to the next entry */ -@@ -3987,11 +4046,11 @@ ins_compl_get_exp(ini) - case CTRL_X_TAGS: - /* set p_ic according to p_ic, p_scs and pat for find_tags(). */ - save_p_ic = p_ic; - p_ic = ignorecase(compl_pattern); - -- /* Find up to TAG_MANY matches. Avoids that an enourmous number -+ /* Find up to TAG_MANY matches. Avoids that an enormous number - * of matches is found when compl_pattern is empty */ - if (find_tags(compl_pattern, &num_matches, &matches, - TAG_REGEXP | TAG_NAMES | TAG_NOIC | - TAG_INS_COMP | (ctrl_x_mode ? TAG_VERBOSE : 0), - TAG_MANY, curbuf->b_ffname) == OK && num_matches > 0) -@@ -4033,11 +4092,11 @@ ins_compl_get_exp(ini) - #endif - - case CTRL_X_SPELL: - #ifdef FEAT_SPELL - num_matches = expand_spelling(first_match_pos.lnum, -- first_match_pos.col, compl_pattern, &matches); -+ compl_pattern, &matches); - if (num_matches > 0) - ins_compl_add_matches(num_matches, matches, p_ic); - #endif - break; - -@@ -4158,11 +4217,11 @@ ins_compl_get_exp(ini) - == NULL - && (IObuff[len - 2] == '?' - || IObuff[len - 2] == '!')))) - IObuff[len++] = ' '; - } -- /* copy as much as posible of the new word */ -+ /* copy as much as possible of the new word */ - if (tmp_ptr - ptr >= IOSIZE - len) - tmp_ptr = ptr + IOSIZE - len - 1; - STRNCPY(IObuff + len, ptr, tmp_ptr - ptr); - len += (int)(tmp_ptr - ptr); - flags |= CONT_S_IPOS; -@@ -4185,11 +4244,11 @@ ins_compl_get_exp(ini) - p_scs = save_p_scs; - p_ws = save_p_ws; - } - - /* check if compl_curr_match has changed, (e.g. other type of -- * expansion added somenthing) */ -+ * expansion added something) */ - if (type != 0 && compl_curr_match != old_match) - found_new_match = OK; - - /* break the loop for specialized modes (use 'complete' just for the - * generic ctrl_x_mode == 0) or when we've found a new match */ -@@ -4254,11 +4313,11 @@ ins_compl_delete() - - /* Insert the new text being completed. */ - static void - ins_compl_insert() - { -- ins_bytes(compl_shown_match->cp_str + curwin->w_cursor.col - compl_col); -+ ins_bytes(compl_shown_match->cp_str + ins_compl_len()); - if (compl_shown_match->cp_flags & ORIGINAL_TEXT) - compl_used_match = FALSE; - else - compl_used_match = TRUE; - } -@@ -4423,11 +4482,11 @@ ins_compl_next(allow_get_expansion, coun - if (insert_match) - { - if (!compl_get_longest || compl_used_match) - ins_compl_insert(); - else -- ins_bytes(compl_leader + curwin->w_cursor.col - compl_col); -+ ins_bytes(compl_leader + ins_compl_len()); - } - else - compl_used_match = FALSE; - - if (!allow_get_expansion) -@@ -4623,10 +4682,11 @@ ins_complete(c) - { - char_u *line; - int startcol = 0; /* column where searched text starts */ - colnr_T curs_col; /* cursor column */ - int n; -+ int save_w_wrow; - - compl_direction = ins_compl_key2dir(c); - if (!compl_started) - { - /* First time we hit ^N or ^P (in a row, I mean) */ -@@ -4686,11 +4746,11 @@ ins_complete(c) - } - compl_col = compl_startpos.col; - } - compl_length = curwin->w_cursor.col - (int)compl_col; - /* IObuff is used to add a "word from the next line" would we -- * have enough space? just being paranoic */ -+ * have enough space? just being paranoid */ - #define MIN_SPACE 75 - if (compl_length > (IOSIZE - MIN_SPACE)) - { - compl_cont_status &= ~CONT_SOL; - compl_length = (IOSIZE - MIN_SPACE); -@@ -4743,14 +4803,13 @@ ins_complete(c) - } - else if (compl_cont_status & CONT_ADDING) - { - char_u *prefix = (char_u *)"\\<"; - -- /* we need 3 extra chars, 1 for the NUL and -- * 2 >= strlen(prefix) -- Acevedo */ -+ /* we need up to 2 extra chars for the prefix */ - compl_pattern = alloc(quote_meta(NULL, line + compl_col, -- compl_length) + 3); -+ compl_length) + 2); - if (compl_pattern == NULL) - return FAIL; - if (!vim_iswordp(line + compl_col) - || (compl_col > 0 - && ( -@@ -4821,11 +4880,11 @@ ins_complete(c) - STRCAT((char *)compl_pattern, "\\k"); - } - else - { - compl_pattern = alloc(quote_meta(NULL, line + compl_col, -- compl_length) + 3); -+ compl_length) + 2); - if (compl_pattern == NULL) - return FAIL; - STRCPY((char *)compl_pattern, "\\<"); - (void)quote_meta(compl_pattern + 2, line + compl_col, - compl_length); -@@ -4903,11 +4962,11 @@ ins_complete(c) - curwin->w_cursor = pos; /* restore the cursor position */ - - if (col < 0) - col = curs_col; - compl_col = col; -- if ((colnr_T)compl_col > curs_col) -+ if (compl_col > curs_col) - compl_col = curs_col; - - /* Setup variables for completion. Need to obtain "line" again, - * it may have become invalid. */ - line = ml_get(curwin->w_cursor.lnum); -@@ -5007,10 +5066,11 @@ ins_complete(c) - compl_shows_dir = compl_direction; - - /* - * Find next match (and following matches). - */ -+ save_w_wrow = curwin->w_wrow; - n = ins_compl_next(TRUE, ins_compl_key2count(c), ins_compl_use_match(c)); - - /* may undisplay the popup menu */ - ins_compl_upd_pum(); - -@@ -5160,10 +5220,16 @@ ins_complete(c) - if (!compl_interrupted) - { - /* RedrawingDisabled may be set when invoked through complete(). */ - n = RedrawingDisabled; - RedrawingDisabled = 0; -+ -+ /* If the cursor moved we need to remove the pum first. */ -+ setcursor(); -+ if (save_w_wrow != curwin->w_wrow) -+ ins_compl_del_pum(); -+ - ins_compl_show_pum(); - setcursor(); - RedrawingDisabled = n; - } - compl_was_interrupted = compl_interrupted; -@@ -5176,19 +5242,19 @@ ins_complete(c) - * Looks in the first "len" chars. of "src" for search-metachars. - * If dest is not NULL the chars. are copied there quoting (with - * a backslash) the metachars, and dest would be NUL terminated. - * Returns the length (needed) of dest - */ -- static int -+ static unsigned - quote_meta(dest, src, len) - char_u *dest; - char_u *src; - int len; - { -- int m; -+ unsigned m = (unsigned)len + 1; /* one extra for the NUL */ - -- for (m = len; --len >= 0; src++) -+ for ( ; --len >= 0; src++) - { - switch (*src) - { - case '.': - case '*': -@@ -5498,11 +5564,11 @@ insertchar(c, flags, second_indent) - * was called. */ - ins_need_undo = TRUE; - } - if (do_internal) - #endif -- internal_format(textwidth, second_indent, flags, c == NUL); -+ internal_format(textwidth, second_indent, flags, c == NUL, c); - } - - if (c == NUL) /* only formatting was wanted */ - return; - -@@ -5678,15 +5744,16 @@ insertchar(c, flags, second_indent) - - /* - * Format text at the current insert position. - */ - static void --internal_format(textwidth, second_indent, flags, format_only) -+internal_format(textwidth, second_indent, flags, format_only, c) - int textwidth; - int second_indent; - int flags; - int format_only; -+ int c; /* character to be inserted (can be NUL) */ - { - int cc; - int save_char = NUL; - int haveto_redraw = FALSE; - int fo_ins_blank = has_format_option(FO_INS_BLANK); -@@ -5703,11 +5770,15 @@ internal_format(textwidth, second_indent - - /* - * When 'ai' is off we don't want a space under the cursor to be - * deleted. Replace it with an 'x' temporarily. - */ -- if (!curbuf->b_p_ai) -+ if (!curbuf->b_p_ai -+#ifdef FEAT_VREPLACE -+ && !(State & VREPLACE_FLAG) -+#endif -+ ) - { - cc = gchar_cursor(); - if (vim_iswhite(cc)) - { - save_char = cc; -@@ -5729,13 +5800,15 @@ internal_format(textwidth, second_indent - #ifdef FEAT_VREPLACE - int orig_col = 0; - char_u *saved_text = NULL; - #endif - colnr_T col; -+ colnr_T end_col; - -- virtcol = get_nolist_virtcol(); -- if (virtcol < (colnr_T)textwidth) -+ virtcol = get_nolist_virtcol() -+ + char2cells(c != NUL ? c : gchar_cursor()); -+ if (virtcol <= (colnr_T)textwidth) - break; - - #ifdef FEAT_COMMENTS - if (no_leader) - do_comments = FALSE; -@@ -5760,42 +5833,37 @@ internal_format(textwidth, second_indent - #ifdef FEAT_COMMENTS - && leader_len == 0 - #endif - && !has_format_option(FO_WRAP)) - -- { -- textwidth = 0; - break; -- } - if ((startcol = curwin->w_cursor.col) == 0) - break; - - /* find column of textwidth border */ - coladvance((colnr_T)textwidth); - wantcol = curwin->w_cursor.col; - -- curwin->w_cursor.col = startcol - 1; --#ifdef FEAT_MBYTE -- /* Correct cursor for multi-byte character. */ -- if (has_mbyte) -- mb_adjust_cursor(); --#endif -+ curwin->w_cursor.col = startcol; - foundcol = 0; - - /* - * Find position to break at. - * Stop at first entered white when 'formatoptions' has 'v' - */ - while ((!fo_ins_blank && !has_format_option(FO_INS_VI)) - || curwin->w_cursor.lnum != Insstart.lnum - || curwin->w_cursor.col >= Insstart.col) - { -- cc = gchar_cursor(); -+ if (curwin->w_cursor.col == startcol && c != NUL) -+ cc = c; -+ else -+ cc = gchar_cursor(); - if (WHITECHAR(cc)) - { - /* remember position of blank just before text */ -- end_foundcol = curwin->w_cursor.col; -+ end_col = curwin->w_cursor.col; - - /* find start of sequence of blanks */ - while (curwin->w_cursor.col > 0 && WHITECHAR(cc)) - { - dec_cursor(); -@@ -5811,39 +5879,77 @@ internal_format(textwidth, second_indent - if (has_format_option(FO_ONE_LETTER)) - { - /* do not break after one-letter words */ - if (curwin->w_cursor.col == 0) - break; /* one-letter word at begin */ -- -+#ifdef FEAT_COMMENTS -+ /* do not break "#a b" when 'tw' is 2 */ -+ if (curwin->w_cursor.col <= leader_len) -+ break; -+#endif - col = curwin->w_cursor.col; - dec_cursor(); - cc = gchar_cursor(); - - if (WHITECHAR(cc)) - continue; /* one-letter, continue */ - curwin->w_cursor.col = col; - } --#ifdef FEAT_MBYTE -- if (has_mbyte) -- foundcol = curwin->w_cursor.col -- + (*mb_ptr2len)(ml_get_cursor()); -- else --#endif -- foundcol = curwin->w_cursor.col + 1; -- if (curwin->w_cursor.col < (colnr_T)wantcol) -+ -+ inc_cursor(); -+ -+ end_foundcol = end_col + 1; -+ foundcol = curwin->w_cursor.col; -+ if (curwin->w_cursor.col <= (colnr_T)wantcol) - break; - } - #ifdef FEAT_MBYTE -- else if (cc >= 0x100 && fo_multibyte -- && curwin->w_cursor.col <= (colnr_T)wantcol) -+ else if (cc >= 0x100 && fo_multibyte) - { - /* Break after or before a multi-byte character. */ -+ if (curwin->w_cursor.col != startcol) -+ { -+#ifdef FEAT_COMMENTS -+ /* Don't break until after the comment leader */ -+ if (curwin->w_cursor.col < leader_len) -+ break; -+#endif -+ col = curwin->w_cursor.col; -+ inc_cursor(); -+ /* Don't change end_foundcol if already set. */ -+ if (foundcol != curwin->w_cursor.col) -+ { -+ foundcol = curwin->w_cursor.col; -+ end_foundcol = foundcol; -+ if (curwin->w_cursor.col <= (colnr_T)wantcol) -+ break; -+ } -+ curwin->w_cursor.col = col; -+ } -+ -+ if (curwin->w_cursor.col == 0) -+ break; -+ -+ col = curwin->w_cursor.col; -+ -+ dec_cursor(); -+ cc = gchar_cursor(); -+ -+ if (WHITECHAR(cc)) -+ continue; /* break with space */ -+#ifdef FEAT_COMMENTS -+ /* Don't break until after the comment leader */ -+ if (curwin->w_cursor.col < leader_len) -+ break; -+#endif -+ -+ curwin->w_cursor.col = col; -+ - foundcol = curwin->w_cursor.col; -- if (curwin->w_cursor.col < (colnr_T)wantcol) -- foundcol += (*mb_char2len)(cc); - end_foundcol = foundcol; -- break; -+ if (curwin->w_cursor.col <= (colnr_T)wantcol) -+ break; - } - #endif - if (curwin->w_cursor.col == 0) - break; - dec_cursor(); -@@ -5866,18 +5972,19 @@ internal_format(textwidth, second_indent - #ifdef FEAT_VREPLACE - if (State & VREPLACE_FLAG) - orig_col = startcol; /* Will start backspacing from here */ - else - #endif -- replace_offset = startcol - end_foundcol - 1; -+ replace_offset = startcol - end_foundcol; - - /* - * adjust startcol for spaces that will be deleted and - * characters that will remain on top line - */ - curwin->w_cursor.col = foundcol; -- while (cc = gchar_cursor(), WHITECHAR(cc)) -+ while ((cc = gchar_cursor(), WHITECHAR(cc)) -+ && (!fo_white_par || curwin->w_cursor.col < startcol)) - inc_cursor(); - startcol -= curwin->w_cursor.col; - if (startcol < 0) - startcol = 0; - -@@ -6013,11 +6120,11 @@ auto_format(trailblank, prev_line) - /* Don't format in Insert mode when the cursor is on a trailing blank, the - * user might insert normal text next. Also skip formatting when "1" is - * in 'formatoptions' and there is a single character before the cursor. - * Otherwise the line would be broken and when typing another non-white - * next they are not joined back together. */ -- wasatend = (pos.col == STRLEN(old)); -+ wasatend = (pos.col == (colnr_T)STRLEN(old)); - if (*old != NUL && !trailblank && wasatend) - { - dec_cursor(); - cc = gchar_cursor(); - if (!WHITECHAR(cc) && curwin->w_cursor.col > 0 -@@ -6190,11 +6297,11 @@ redo_literal(c) - - /* Only digits need special treatment. Translate them into a string of - * three digits. */ - if (VIM_ISDIGIT(c)) - { -- sprintf((char *)buf, "%03d", c); -+ vim_snprintf((char *)buf, sizeof(buf), "%03d", c); - AppendToRedobuff(buf); - } - else - AppendCharToRedobuff(c); - } -@@ -6264,11 +6371,11 @@ stop_arrow() - { - arrow_used = FALSE; - ins_need_undo = FALSE; - } - Insstart = curwin->w_cursor; /* new insertion starts here */ -- Insstart_textlen = linetabsize(ml_get_curline()); -+ Insstart_textlen = (colnr_T)linetabsize(ml_get_curline()); - ai_col = 0; - #ifdef FEAT_VREPLACE - if (State & VREPLACE_FLAG) - { - orig_line_count = curbuf->b_ml.ml_line_count; -@@ -6367,25 +6474,30 @@ stop_insert(end_insert_pos, esc) - /* If a space was inserted for auto-formatting, remove it now. */ - check_auto_format(TRUE); - - /* If we just did an auto-indent, remove the white space from the end - * of the line, and put the cursor back. -- * Do this when ESC was used or moving the cursor up/down. */ -+ * Do this when ESC was used or moving the cursor up/down. -+ * Check for the old position still being valid, just in case the text -+ * got changed unexpectedly. */ - if (did_ai && (esc || (vim_strchr(p_cpo, CPO_INDENT) == NULL -- && curwin->w_cursor.lnum != end_insert_pos->lnum))) -+ && curwin->w_cursor.lnum != end_insert_pos->lnum)) -+ && end_insert_pos->lnum <= curbuf->b_ml.ml_line_count) - { - pos_T tpos = curwin->w_cursor; - - curwin->w_cursor = *end_insert_pos; -+ check_cursor_col(); /* make sure it is not past the line */ - for (;;) - { - if (gchar_cursor() == NUL && curwin->w_cursor.col > 0) - --curwin->w_cursor.col; - cc = gchar_cursor(); - if (!vim_iswhite(cc)) - break; -- (void)del_char(TRUE); -+ if (del_char(TRUE) == FAIL) -+ break; /* should not happen */ - } - if (curwin->w_cursor.lnum != tpos.lnum) - curwin->w_cursor = tpos; - else if (cc != NUL) - ++curwin->w_cursor.col; /* put cursor back on the NUL */ -@@ -6393,14 +6505,15 @@ stop_insert(end_insert_pos, esc) - #ifdef FEAT_VISUAL - /* <C-S-Right> may have started Visual mode, adjust the position for - * deleted characters. */ - if (VIsual_active && VIsual.lnum == curwin->w_cursor.lnum) - { -- cc = (int)STRLEN(ml_get_curline()); -- if (VIsual.col > (colnr_T)cc) -+ int len = (int)STRLEN(ml_get_curline()); -+ -+ if (VIsual.col > len) - { -- VIsual.col = cc; -+ VIsual.col = len; - # ifdef FEAT_VIRTUALEDIT - VIsual.coladd = 0; - # endif - } - } -@@ -7121,13 +7234,16 @@ replace_flush() - * Handle doing a BS for one character. - * cc < 0: replace stack empty, just move cursor - * cc == 0: character was inserted, delete it - * cc > 0: character was replaced, put cc (first byte of original char) back - * and check for more characters to be put back -+ * When "limit_col" is >= 0, don't delete before this column. Matters when -+ * using composing characters, use del_char_after_col() instead of del_char(). - */ - static void --replace_do_bs() -+replace_do_bs(limit_col) -+ int limit_col; - { - int cc; - #ifdef FEAT_VREPLACE - int orig_len = 0; - int ins_len; -@@ -7151,11 +7267,11 @@ replace_do_bs() - } - #endif - #ifdef FEAT_MBYTE - if (has_mbyte) - { -- del_char(FALSE); -+ (void)del_char_after_col(limit_col); - # ifdef FEAT_VREPLACE - if (State & VREPLACE_FLAG) - orig_len = (int)STRLEN(ml_get_cursor()); - # endif - replace_push(cc); -@@ -7201,11 +7317,11 @@ replace_do_bs() - - /* mark the buffer as changed and prepare for displaying */ - changed_bytes(curwin->w_cursor.lnum, curwin->w_cursor.col); - } - else if (cc == 0) -- (void)del_char(FALSE); -+ (void)del_char_after_col(limit_col); - } - - #ifdef FEAT_CINDENT - /* - * Return TRUE if C-indenting is on. -@@ -7284,10 +7400,14 @@ in_cinkeys(keytyped, when, line_is_empty - char_u *p; - char_u *line; - int icase; - int i; - -+ if (keytyped == NUL) -+ /* Can happen with CTRL-Y and CTRL-E on a short line. */ -+ return FALSE; -+ - #ifdef FEAT_EVAL - if (*curbuf->b_p_inde != NUL) - look = curbuf->b_p_indk; /* 'indentexpr' set: use 'indentkeys' */ - else - #endif -@@ -7644,24 +7764,20 @@ ins_reg() - * Don't map the register name. This also prevents the mode message to be - * deleted when ESC is hit. - */ - ++no_mapping; - regname = plain_vgetc(); --#ifdef FEAT_LANGMAP - LANGMAP_ADJUST(regname, TRUE); --#endif - if (regname == Ctrl_R || regname == Ctrl_O || regname == Ctrl_P) - { - /* Get a third key for literal register insertion */ - literally = regname; - #ifdef FEAT_CMDL_INFO - add_to_showcmd_c(literally); - #endif - regname = plain_vgetc(); --#ifdef FEAT_LANGMAP - LANGMAP_ADJUST(regname, TRUE); --#endif - } - --no_mapping; - - #ifdef FEAT_EVAL - /* -@@ -8148,11 +8264,11 @@ ins_ctrl_o() - } - - /* - * If the cursor is on an indent, ^T/^D insert/delete one - * shiftwidth. Otherwise ^T/^D behave like a "<<" or ">>". -- * Always round the indent to 'shiftwith', this is compatible -+ * Always round the indent to 'shiftwidth', this is compatible - * with vi. But vi only supports ^T and ^D after an - * autoindent, we support it everywhere. - */ - static void - ins_shift(c, lastc) -@@ -8237,11 +8353,11 @@ ins_bs_one(vcolp) - { - /* Don't delete characters before the insert point when in - * Replace mode */ - if (curwin->w_cursor.lnum != Insstart.lnum - || curwin->w_cursor.col >= Insstart.col) -- replace_do_bs(); -+ replace_do_bs(-1); - } - else - (void)del_char(FALSE); - } - -@@ -8256,10 +8372,11 @@ ins_bs(c, mode, inserted_space_p) - int *inserted_space_p; - { - linenr_T lnum; - int cc; - int temp = 0; /* init for GCC */ -+ colnr_T save_col; - colnr_T mincol; - int did_backspace = FALSE; - int in_indent; - int oldState; - #ifdef FEAT_MBYTE -@@ -8413,17 +8530,17 @@ ins_bs(c, mode, inserted_space_p) - /* - * restore characters (blanks) deleted after cursor - */ - while (cc > 0) - { -- temp = curwin->w_cursor.col; -+ save_col = curwin->w_cursor.col; - #ifdef FEAT_MBYTE - mb_replace_pop_ins(cc); - #else - ins_char(cc); - #endif -- curwin->w_cursor.col = temp; -+ curwin->w_cursor.col = save_col; - cc = replace_pop(); - } - /* restore the characters that NL replaced */ - replace_pop_ins(); - State = oldState; -@@ -8443,23 +8560,23 @@ ins_bs(c, mode, inserted_space_p) - mincol = 0; - /* keep indent */ - if (mode == BACKSPACE_LINE - && (curbuf->b_p_ai - #ifdef FEAT_CINDENT -- || cindent_on() -+ || cindent_on() - #endif - ) - #ifdef FEAT_RIGHTLEFT - && !revins_on - #endif - ) - { -- temp = curwin->w_cursor.col; -+ save_col = curwin->w_cursor.col; - beginline(BL_WHITE); -- if (curwin->w_cursor.col < (colnr_T)temp) -+ if (curwin->w_cursor.col < save_col) - mincol = curwin->w_cursor.col; -- curwin->w_cursor.col = temp; -+ curwin->w_cursor.col = save_col; - } - - /* - * Handle deleting one 'shiftwidth' or 'softtabstop'. - */ -@@ -8554,11 +8671,11 @@ ins_bs(c, mode, inserted_space_p) - dec_cursor(); - #endif - break; - } - if (State & REPLACE_FLAG) -- replace_do_bs(); -+ replace_do_bs(-1); - else - { - #ifdef FEAT_MBYTE - if (enc_utf8 && p_deco) - (void)utfc_ptr2char(ml_get_cursor(), cpc); -@@ -8929,11 +9046,14 @@ ins_right() - #ifdef FEAT_FOLDING - if ((fdo_flags & FDO_HOR) && KeyTyped) - foldOpenCursor(); - #endif - undisplay_dollar(); -- if (gchar_cursor() != NUL || virtual_active() -+ if (gchar_cursor() != NUL -+#ifdef FEAT_VIRTUALEDIT -+ || virtual_active() -+#endif - ) - { - start_arrow(&curwin->w_cursor); - curwin->w_set_curswant = TRUE; - #ifdef FEAT_VIRTUALEDIT ---- vim72.orig/src/eval.c -+++ vim72/src/eval.c -@@ -30,10 +30,13 @@ - # include <math.h> - #endif - - #define DICT_MAXNEST 100 /* maximum nesting of lists and dicts */ - -+#define DO_NOT_FREE_CNT 99999 /* refcount for dict or list that should not -+ be freed. */ -+ - /* - * In a hashtab item "hi_key" points to "di_key" in a dictitem. - * This avoids adding a pointer to the hashtab item. - * DI2HIKEY() converts a dictitem pointer to a hashitem key pointer. - * HIKEY2DI() converts a hashitem key pointer to a dictitem pointer. -@@ -124,12 +127,15 @@ static dictitem_T globvars_var; - static hashtab_T compat_hashtab; - - /* - * When recursively copying lists and dicts we need to remember which ones we - * have done to avoid endless recursiveness. This unique ID is used for that. -+ * The last bit is used for previous_funccal, ignored when comparing. - */ - static int current_copyID = 0; -+#define COPYID_INC 2 -+#define COPYID_MASK (~0x1) - - /* - * Array to hold the hashtab with variables local to each sourced script. - * Each item holds a variable (nameless) that points to the dict_T. - */ -@@ -278,11 +284,11 @@ typedef struct - /* values for vv_flags: */ - #define VV_COMPAT 1 /* compatible, also used without "v:" */ - #define VV_RO 2 /* read-only */ - #define VV_RO_SBX 4 /* read-only in the sandbox */ - --#define VV_NAME(s, t) s, {{t}}, {0} -+#define VV_NAME(s, t) s, {{t, 0, {0}}, 0, {0}}, {0} - - static struct vimvar - { - char *vv_name; /* name of variable, without v: */ - dictitem_T vv_di; /* value and name for key */ -@@ -346,17 +352,19 @@ static struct vimvar - {VV_NAME("mouse_win", VAR_NUMBER), 0}, - {VV_NAME("mouse_lnum", VAR_NUMBER), 0}, - {VV_NAME("mouse_col", VAR_NUMBER), 0}, - {VV_NAME("operator", VAR_STRING), VV_RO}, - {VV_NAME("searchforward", VAR_NUMBER), 0}, -+ {VV_NAME("oldfiles", VAR_LIST), 0}, - }; - - /* shorthand */ - #define vv_type vv_di.di_tv.v_type - #define vv_nr vv_di.di_tv.vval.v_number - #define vv_float vv_di.di_tv.vval.v_float - #define vv_str vv_di.di_tv.vval.v_string -+#define vv_list vv_di.di_tv.vval.v_list - #define vv_tv vv_di.di_tv - - /* - * The v: variables are stored in dictionary "vimvardict". - * "vimvars_var" is the variable that is used for the "l:" scope. -@@ -423,31 +431,27 @@ static int dict_equal __ARGS((dict_T *d1 - static int tv_equal __ARGS((typval_T *tv1, typval_T *tv2, int ic)); - static listitem_T *list_find __ARGS((list_T *l, long n)); - static long list_find_nr __ARGS((list_T *l, long idx, int *errorp)); - static long list_idx_of_item __ARGS((list_T *l, listitem_T *item)); - static void list_append __ARGS((list_T *l, listitem_T *item)); --static int list_append_tv __ARGS((list_T *l, typval_T *tv)); --static int list_append_string __ARGS((list_T *l, char_u *str, int len)); - static int list_append_number __ARGS((list_T *l, varnumber_T n)); - static int list_insert_tv __ARGS((list_T *l, typval_T *tv, listitem_T *item)); - static int list_extend __ARGS((list_T *l1, list_T *l2, listitem_T *bef)); - static int list_concat __ARGS((list_T *l1, list_T *l2, typval_T *tv)); - static list_T *list_copy __ARGS((list_T *orig, int deep, int copyID)); - static void list_remove __ARGS((list_T *l, listitem_T *item, listitem_T *item2)); - static char_u *list2string __ARGS((typval_T *tv, int copyID)); - static int list_join __ARGS((garray_T *gap, list_T *l, char_u *sep, int echo, int copyID)); -+static int free_unref_items __ARGS((int copyID)); - static void set_ref_in_ht __ARGS((hashtab_T *ht, int copyID)); - static void set_ref_in_list __ARGS((list_T *l, int copyID)); - static void set_ref_in_item __ARGS((typval_T *tv, int copyID)); - static void dict_unref __ARGS((dict_T *d)); - static void dict_free __ARGS((dict_T *d, int recurse)); --static dictitem_T *dictitem_alloc __ARGS((char_u *key)); - static dictitem_T *dictitem_copy __ARGS((dictitem_T *org)); - static void dictitem_remove __ARGS((dict_T *dict, dictitem_T *item)); --static void dictitem_free __ARGS((dictitem_T *item)); - static dict_T *dict_copy __ARGS((dict_T *orig, int deep, int copyID)); --static int dict_add __ARGS((dict_T *d, dictitem_T *item)); - static long dict_len __ARGS((dict_T *d)); - static dictitem_T *dict_find __ARGS((dict_T *d, char_u *key, int len)); - static char_u *dict2string __ARGS((typval_T *tv, int copyID)); - static int get_dict_tv __ARGS((char_u **arg, typval_T *rettv, int evaluate)); - static char_u *echo_string __ARGS((typval_T *tv, char_u **tofree, char_u *numbuf, int copyID)); -@@ -618,10 +622,13 @@ static void f_max __ARGS((typval_T *argv - static void f_min __ARGS((typval_T *argvars, typval_T *rettv)); - #ifdef vim_mkdir - static void f_mkdir __ARGS((typval_T *argvars, typval_T *rettv)); - #endif - static void f_mode __ARGS((typval_T *argvars, typval_T *rettv)); -+#ifdef FEAT_MZSCHEME -+static void f_mzeval __ARGS((typval_T *argvars, typval_T *rettv)); -+#endif - static void f_nextnonblank __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_nr2char __ARGS((typval_T *argvars, typval_T *rettv)); - static void f_pathshorten __ARGS((typval_T *argvars, typval_T *rettv)); - #ifdef FEAT_FLOAT - static void f_pow __ARGS((typval_T *argvars, typval_T *rettv)); -@@ -754,11 +761,10 @@ static void list_one_var __ARGS((dictite - static void list_one_var_a __ARGS((char_u *prefix, char_u *name, int type, char_u *string, int *first)); - static void set_var __ARGS((char_u *name, typval_T *varp, int copy)); - static int var_check_ro __ARGS((int flags, char_u *name)); - static int var_check_fixed __ARGS((int flags, char_u *name)); - static int tv_check_lock __ARGS((int lock, char_u *name)); --static void copy_tv __ARGS((typval_T *from, typval_T *to)); - static int item_copy __ARGS((typval_T *from, typval_T *to, int deep, int copyID)); - static char_u *find_option_end __ARGS((char_u **arg, int *opt_flags)); - static char_u *trans_function_name __ARGS((char_u **pp, int skip, int flags, funcdict_T *fd)); - static int eval_fname_script __ARGS((char_u *p)); - static int eval_fname_sid __ARGS((char_u *p)); -@@ -786,10 +792,12 @@ static char_u *autoload_name __ARGS((cha - static void cat_func_name __ARGS((char_u *buf, ufunc_T *fp)); - static void func_free __ARGS((ufunc_T *fp)); - static void func_unref __ARGS((char_u *name)); - static void func_ref __ARGS((char_u *name)); - static void call_user_func __ARGS((ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rettv, linenr_T firstline, linenr_T lastline, dict_T *selfdict)); -+static int can_free_funccal __ARGS((funccall_T *fc, int copyID)) ; -+static void free_funccal __ARGS((funccall_T *fc, int free_val)); - static void add_nr_var __ARGS((dict_T *dp, dictitem_T *v, char *name, varnumber_T nr)); - static win_T *find_win_by_nr __ARGS((typval_T *vp, tabpage_T *tp)); - static void getwinvar __ARGS((typval_T *argvars, typval_T *rettv, int off)); - static int searchpair_cmn __ARGS((typval_T *argvars, pos_T *match_pos)); - static int search_cmn __ARGS((typval_T *argvars, pos_T *match_pos, int *flagsp)); -@@ -843,15 +851,21 @@ eval_clear() - for (i = 0; i < VV_LEN; ++i) - { - p = &vimvars[i]; - if (p->vv_di.di_tv.v_type == VAR_STRING) - { -- vim_free(p->vv_di.di_tv.vval.v_string); -- p->vv_di.di_tv.vval.v_string = NULL; -+ vim_free(p->vv_str); -+ p->vv_str = NULL; -+ } -+ else if (p->vv_di.di_tv.v_type == VAR_LIST) -+ { -+ list_unref(p->vv_list); -+ p->vv_list = NULL; - } - } - hash_clear(&vimvarht); -+ hash_init(&vimvarht); /* garbage_collect() will access it */ - hash_clear(&compat_hashtab); - - /* script-local variables */ - for (i = 1; i <= ga_scripts.ga_len; ++i) - vars_clear(&SCRIPT_VARS(i)); -@@ -914,10 +928,14 @@ func_level(cookie) - } - - /* pointer to funccal for currently active function */ - funccall_T *current_funccal = NULL; - -+/* pointer to list of previously used funccal, still around because some -+ * item in it is still being used. */ -+funccall_T *previous_funccal = NULL; -+ - /* - * Return TRUE when a function was ended by a ":return" command. - */ - int - current_func_returned() -@@ -966,17 +984,18 @@ var_redir_start(name, append) - { - int save_emsg; - int err; - typval_T tv; - -- /* Make sure a valid variable name is specified */ -+ /* Catch a bad name early. */ - if (!eval_isnamec1(*name)) - { - EMSG(_(e_invarg)); - return FAIL; - } - -+ /* Make a copy of the name, it is used in redir_lval until redir ends. */ - redir_varname = vim_strsave(name); - if (redir_varname == NULL) - return FAIL; - - redir_lval = (lval_T *)alloc_clear((unsigned)sizeof(lval_T)); -@@ -997,10 +1016,11 @@ var_redir_start(name, append) - if (redir_endp != NULL && *redir_endp != NUL) - /* Trailing characters are present after the variable name */ - EMSG(_(e_trailing)); - else - EMSG(_(e_invarg)); -+ redir_endp = NULL; /* don't store a value, only cleanup */ - var_redir_stop(); - return FAIL; - } - - /* check if we can write to the variable: set it to or append an empty -@@ -1015,10 +1035,11 @@ var_redir_start(name, append) - set_var_lval(redir_lval, redir_endp, &tv, TRUE, (char_u *)"="); - err = did_emsg; - did_emsg |= save_emsg; - if (err) - { -+ redir_endp = NULL; /* don't store a value, only cleanup */ - var_redir_stop(); - return FAIL; - } - if (redir_lval->ll_newkey != NULL) - { -@@ -1063,26 +1084,31 @@ var_redir_str(value, value_len) - var_redir_stop(); - } - - /* - * Stop redirecting command output to a variable. -+ * Frees the allocated memory. - */ - void - var_redir_stop() - { - typval_T tv; - - if (redir_lval != NULL) - { -- /* Append the trailing NUL. */ -- ga_append(&redir_ga, NUL); -+ /* If there was no error: assign the text to the variable. */ -+ if (redir_endp != NULL) -+ { -+ ga_append(&redir_ga, NUL); /* Append the trailing NUL. */ -+ tv.v_type = VAR_STRING; -+ tv.vval.v_string = redir_ga.ga_data; -+ set_var_lval(redir_lval, redir_endp, &tv, FALSE, (char_u *)"."); -+ } - -- /* Assign the text to the variable. */ -- tv.v_type = VAR_STRING; -- tv.vval.v_string = redir_ga.ga_data; -- set_var_lval(redir_lval, redir_endp, &tv, FALSE, (char_u *)"."); -- vim_free(tv.vval.v_string); -+ /* free the collected output */ -+ vim_free(redir_ga.ga_data); -+ redir_ga.ga_data = NULL; - - clear_lval(redir_lval); - vim_free(redir_lval); - redir_lval = NULL; - } -@@ -1254,34 +1280,46 @@ skip_expr(pp) - return eval1(pp, &rettv, FALSE); - } - - /* - * Top level evaluation function, returning a string. -+ * When "convert" is TRUE convert a List into a sequence of lines and convert -+ * a Float to a String. - * Return pointer to allocated memory, or NULL for failure. - */ - char_u * --eval_to_string(arg, nextcmd, dolist) -+eval_to_string(arg, nextcmd, convert) - char_u *arg; - char_u **nextcmd; -- int dolist; /* turn List into sequence of lines */ -+ int convert; - { - typval_T tv; - char_u *retval; - garray_T ga; -+#ifdef FEAT_FLOAT -+ char_u numbuf[NUMBUFLEN]; -+#endif - - if (eval0(arg, &tv, nextcmd, TRUE) == FAIL) - retval = NULL; - else - { -- if (dolist && tv.v_type == VAR_LIST) -+ if (convert && tv.v_type == VAR_LIST) - { - ga_init2(&ga, (int)sizeof(char), 80); - if (tv.vval.v_list != NULL) - list_join(&ga, tv.vval.v_list, (char_u *)"\n", TRUE, 0); - ga_append(&ga, NUL); - retval = (char_u *)ga.ga_data; - } -+#ifdef FEAT_FLOAT -+ else if (convert && tv.v_type == VAR_FLOAT) -+ { -+ vim_snprintf((char *)numbuf, NUMBUFLEN, "%g", tv.vval.v_float); -+ retval = vim_strsave(numbuf); -+ } -+#endif - else - retval = vim_strsave(get_tv_string(&tv)); - clear_tv(&tv); - } - -@@ -3275,11 +3313,11 @@ ex_call(eap) - startarg = skipwhite(arg); - rettv.v_type = VAR_UNKNOWN; /* clear_tv() uses this */ - - if (*startarg != '(') - { -- EMSG2(_("E107: Missing braces: %s"), eap->arg); -+ EMSG2(_("E107: Missing parentheses: %s"), eap->arg); - goto end; - } - - /* - * When skipping, evaluate the function once, to find the end of the -@@ -3655,12 +3693,12 @@ item_lock(tv, deep, lock) - } - --recurse; - } - - /* -- * Return TRUE if typeval "tv" is locked: Either tha value is locked itself or -- * it refers to a List or Dictionary that is locked. -+ * Return TRUE if typeval "tv" is locked: Either that value is locked itself -+ * or it refers to a List or Dictionary that is locked. - */ - static int - tv_islocked(tv) - typval_T *tv; - { -@@ -3742,11 +3780,10 @@ cat_prefix_varname(prefix, name) - - /* - * Function given to ExpandGeneric() to obtain the list of user defined - * (global/buffer/window/built-in) variable names. - */ --/*ARGSUSED*/ - char_u * - get_user_var_name(xp, idx) - expand_T *xp; - int idx; - { -@@ -3900,11 +3937,11 @@ eval0(arg, rettv, nextcmd, evaluate) - return ret; - } - - /* - * Handle top level expression: -- * expr1 ? expr0 : expr0 -+ * expr2 ? expr1 : expr1 - * - * "arg" must point to the first non-white of the expression. - * "arg" is advanced to the next non-white after the recognized expression. - * - * Note: "rettv.v_lock" is not set. -@@ -5833,11 +5870,12 @@ list_equal(l1, l2, ic) - if (!tv_equal(&item1->li_tv, &item2->li_tv, ic)) - return FALSE; - return item1 == NULL && item2 == NULL; - } - --#if defined(FEAT_PYTHON) || defined(PROTO) -+#if defined(FEAT_RUBY) || defined(FEAT_PYTHON) || defined(FEAT_MZSCHEME) \ -+ || defined(PROTO) - /* - * Return the dictitem that an entry in a hashtable points to. - */ - dictitem_T * - dict_lookup(hi) -@@ -6045,10 +6083,29 @@ list_find_nr(l, idx, errorp) - } - return get_tv_number_chk(&li->li_tv, errorp); - } - - /* -+ * Get list item "l[idx - 1]" as a string. Returns NULL for failure. -+ */ -+ char_u * -+list_find_str(l, idx) -+ list_T *l; -+ long idx; -+{ -+ listitem_T *li; -+ -+ li = list_find(l, idx - 1); -+ if (li == NULL) -+ { -+ EMSGN(_(e_listidx), idx); -+ return NULL; -+ } -+ return get_tv_string(&li->li_tv); -+} -+ -+/* - * Locate "item" list "l" and return its index. - * Returns -1 when "item" is not in the list. - */ - static long - list_idx_of_item(l, item) -@@ -6095,11 +6152,11 @@ list_append(l, item) - - /* - * Append typval_T "tv" to the end of list "l". - * Return FAIL when out of memory. - */ -- static int -+ int - list_append_tv(l, tv) - list_T *l; - typval_T *tv; - { - listitem_T *li = listitem_alloc(); -@@ -6135,11 +6192,11 @@ list_append_dict(list, dict) - /* - * Make a copy of "str" and append it as an item to list "l". - * When "len" >= 0 use "str[len]". - * Returns FAIL when out of memory. - */ -- static int -+ int - list_append_string(l, str, len) - list_T *l; - char_u *str; - int len; - { -@@ -6415,10 +6472,11 @@ list_join(gap, l, sep, echo, copyID) - if (s != NULL) - ga_concat(gap, s); - vim_free(tofree); - if (s == NULL) - return FAIL; -+ line_breakcheck(); - } - return OK; - } - - /* -@@ -6446,31 +6504,45 @@ list_join(gap, l, sep, echo, copyID) - * Return TRUE if some memory was freed. - */ - int - garbage_collect() - { -- dict_T *dd; -- list_T *ll; -- int copyID = ++current_copyID; -+ int copyID; - buf_T *buf; - win_T *wp; - int i; -- funccall_T *fc; -- int did_free = FALSE; -+ funccall_T *fc, **pfc; -+ int did_free; -+ int did_free_funccal = FALSE; - #ifdef FEAT_WINDOWS - tabpage_T *tp; - #endif - - /* Only do this once. */ - want_garbage_collect = FALSE; - may_garbage_collect = FALSE; - garbage_collect_at_exit = FALSE; - -+ /* We advance by two because we add one for items referenced through -+ * previous_funccal. */ -+ current_copyID += COPYID_INC; -+ copyID = current_copyID; -+ - /* - * 1. Go through all accessible variables and mark all lists and dicts - * with copyID. - */ -+ -+ /* Don't free variables in the previous_funccal list unless they are only -+ * referenced through previous_funccal. This must be first, because if -+ * the item is referenced elsewhere the funccal must not be freed. */ -+ for (fc = previous_funccal; fc != NULL; fc = fc->caller) -+ { -+ set_ref_in_ht(&fc->l_vars.dv_hashtab, copyID + 1); -+ set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID + 1); -+ } -+ - /* script-local variables */ - for (i = 1; i <= ga_scripts.ga_len; ++i) - set_ref_in_ht(&SCRIPT_VARS(i), copyID); - - /* buffer-local variables */ -@@ -6495,15 +6567,58 @@ garbage_collect() - { - set_ref_in_ht(&fc->l_vars.dv_hashtab, copyID); - set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID); - } - -+ /* v: vars */ -+ set_ref_in_ht(&vimvarht, copyID); -+ -+ /* -+ * 2. Free lists and dictionaries that are not referenced. -+ */ -+ did_free = free_unref_items(copyID); -+ - /* -- * 2. Go through the list of dicts and free items without the copyID. -+ * 3. Check if any funccal can be freed now. -+ */ -+ for (pfc = &previous_funccal; *pfc != NULL; ) -+ { -+ if (can_free_funccal(*pfc, copyID)) -+ { -+ fc = *pfc; -+ *pfc = fc->caller; -+ free_funccal(fc, TRUE); -+ did_free = TRUE; -+ did_free_funccal = TRUE; -+ } -+ else -+ pfc = &(*pfc)->caller; -+ } -+ if (did_free_funccal) -+ /* When a funccal was freed some more items might be garbage -+ * collected, so run again. */ -+ (void)garbage_collect(); -+ -+ return did_free; -+} -+ -+/* -+ * Free lists and dictionaries that are no longer referenced. -+ */ -+ static int -+free_unref_items(copyID) -+ int copyID; -+{ -+ dict_T *dd; -+ list_T *ll; -+ int did_free = FALSE; -+ -+ /* -+ * Go through the list of dicts and free items without the copyID. - */ - for (dd = first_dict; dd != NULL; ) -- if (dd->dv_copyID != copyID) -+ if ((dd->dv_copyID & COPYID_MASK) != (copyID & COPYID_MASK)) - { - /* Free the Dictionary and ordinary items it contains, but don't - * recurse into Lists and Dictionaries, they will be in the list - * of dicts or list of lists. */ - dict_free(dd, FALSE); -@@ -6514,16 +6629,17 @@ garbage_collect() - } - else - dd = dd->dv_used_next; - - /* -- * 3. Go through the list of lists and free items without the copyID. -- * But don't free a list that has a watcher (used in a for loop), these -- * are not referenced anywhere. -+ * Go through the list of lists and free items without the copyID. -+ * But don't free a list that has a watcher (used in a for loop), these -+ * are not referenced anywhere. - */ - for (ll = first_list; ll != NULL; ) -- if (ll->lv_copyID != copyID && ll->lv_watch == NULL) -+ if ((ll->lv_copyID & COPYID_MASK) != (copyID & COPYID_MASK) -+ && ll->lv_watch == NULL) - { - /* Free the List and ordinary items it contains, but don't recurse - * into Lists and Dictionaries, they will be in the list of dicts - * or list of lists. */ - list_free(ll, FALSE); -@@ -6585,21 +6701,21 @@ set_ref_in_item(tv, copyID) - - switch (tv->v_type) - { - case VAR_DICT: - dd = tv->vval.v_dict; -- if (dd->dv_copyID != copyID) -+ if (dd != NULL && dd->dv_copyID != copyID) - { - /* Didn't see this dict yet. */ - dd->dv_copyID = copyID; - set_ref_in_ht(&dd->dv_hashtab, copyID); - } - break; - - case VAR_LIST: - ll = tv->vval.v_list; -- if (ll->lv_copyID != copyID) -+ if (ll != NULL && ll->lv_copyID != copyID) - { - /* Didn't see this list yet. */ - ll->lv_copyID = copyID; - set_ref_in_list(ll, copyID); - } -@@ -6693,11 +6809,11 @@ dict_free(d, recurse) - * Allocate a Dictionary item. - * The "key" is copied to the new item. - * Note that the value of the item "di_tv" still needs to be initialized! - * Returns NULL when out of memory. - */ -- static dictitem_T * -+ dictitem_T * - dictitem_alloc(key) - char_u *key; - { - dictitem_T *di; - -@@ -6749,11 +6865,11 @@ dictitem_remove(dict, item) - } - - /* - * Free a dict item. Also clears the value. - */ -- static void -+ void - dictitem_free(item) - dictitem_T *item; - { - clear_tv(&item->di_tv); - vim_free(item); -@@ -6829,11 +6945,11 @@ dict_copy(orig, deep, copyID) - - /* - * Add item "item" to Dictionary "d". - * Returns FAIL when out of memory and when key already existed. - */ -- static int -+ int - dict_add(d, item) - dict_T *d; - dictitem_T *item; - { - return hash_add(&d->dv_hashtab, item->di_key); -@@ -7523,12 +7639,12 @@ static struct fst - {"getregtype", 0, 1, f_getregtype}, - {"gettabwinvar", 3, 3, f_gettabwinvar}, - {"getwinposx", 0, 0, f_getwinposx}, - {"getwinposy", 0, 0, f_getwinposy}, - {"getwinvar", 2, 2, f_getwinvar}, -- {"glob", 1, 1, f_glob}, -- {"globpath", 2, 2, f_globpath}, -+ {"glob", 1, 2, f_glob}, -+ {"globpath", 2, 3, f_globpath}, - {"has", 1, 1, f_has}, - {"has_key", 2, 2, f_has_key}, - {"haslocaldir", 0, 0, f_haslocaldir}, - {"hasmapto", 1, 3, f_hasmapto}, - {"highlightID", 1, 1, f_hlID}, /* obsolete */ -@@ -7580,10 +7696,13 @@ static struct fst - {"min", 1, 1, f_min}, - #ifdef vim_mkdir - {"mkdir", 1, 3, f_mkdir}, - #endif - {"mode", 0, 1, f_mode}, -+#ifdef FEAT_MZSCHEME -+ {"mzeval", 1, 1, f_mzeval}, -+#endif - {"nextnonblank", 1, 1, f_nextnonblank}, - {"nr2char", 1, 1, f_nr2char}, - {"pathshorten", 1, 1, f_pathshorten}, - #ifdef FEAT_FLOAT - {"pow", 2, 2, f_pow}, -@@ -7721,11 +7840,10 @@ get_function_name(xp, idx) - - /* - * Function given to ExpandGeneric() to obtain the list of internal or - * user defined variable or function names. - */ --/*ARGSUSED*/ - char_u * - get_expr_name(xp, idx) - expand_T *xp; - int idx; - { -@@ -7854,13 +7972,13 @@ get_func_tv(name, len, rettv, arg, first - ret = call_func(name, len, rettv, argcount, argvars, - firstline, lastline, doesrange, evaluate, selfdict); - else if (!aborting()) - { - if (argcount == MAX_FUNC_ARGS) -- emsg_funcname("E740: Too many arguments for function %s", name); -+ emsg_funcname(N_("E740: Too many arguments for function %s"), name); - else -- emsg_funcname("E116: Invalid arguments for function %s", name); -+ emsg_funcname(N_("E116: Invalid arguments for function %s"), name); - } - - while (--argcount >= 0) - clear_tv(&argvars[argcount]); - -@@ -7954,11 +8072,12 @@ call_func(name, len, rettv, argcount, ar - - - /* execute the function if no errors detected and executing */ - if (evaluate && error == ERROR_NONE) - { -- rettv->v_type = VAR_NUMBER; /* default is number rettv */ -+ rettv->v_type = VAR_NUMBER; /* default rettv is number zero */ -+ rettv->vval.v_number = 0; - error = ERROR_UNKNOWN; - - if (!builtin_function(fname)) - { - /* -@@ -8089,10 +8208,11 @@ call_func(name, len, rettv, argcount, ar - return ret; - } - - /* - * Give an error message with a function name. Handle <SNR> things. -+ * "ermsg" is to be passed without translation, use N_() instead of _(). - */ - static void - emsg_funcname(ermsg, name) - char *ermsg; - char_u *name; -@@ -8203,11 +8323,10 @@ f_append(argvars, rettv) - l = argvars[1].vval.v_list; - if (l == NULL) - return; - li = l->lv_first; - } -- rettv->vval.v_number = 0; /* Default: Success */ - for (;;) - { - if (l == NULL) - tv = &argvars[1]; /* append a string */ - else if (li == NULL) -@@ -8236,26 +8355,24 @@ f_append(argvars, rettv) - } - - /* - * "argc()" function - */ --/* ARGSUSED */ - static void - f_argc(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - rettv->vval.v_number = ARGCOUNT; - } - - /* - * "argidx()" function - */ --/* ARGSUSED */ - static void - f_argidx(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - rettv->vval.v_number = curwin->w_arg_idx; - } - -@@ -8329,14 +8446,13 @@ f_atan(argvars, rettv) - #endif - - /* - * "browse(save, title, initdir, default)" function - */ --/* ARGSUSED */ - static void - f_browse(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - #ifdef FEAT_BROWSE - int save; - char_u *title; -@@ -8364,14 +8480,13 @@ f_browse(argvars, rettv) - } - - /* - * "browsedir(title, initdir)" function - */ --/* ARGSUSED */ - static void - f_browsedir(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - #ifdef FEAT_BROWSE - char_u *title; - char_u *initdir; -@@ -8592,14 +8707,13 @@ f_bufwinnr(argvars, rettv) - } - - /* - * "byte2line(byte)" function - */ --/*ARGSUSED*/ - static void - f_byte2line(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - #ifndef FEAT_BYTEOFF - rettv->vval.v_number = -1; - #else -@@ -8615,11 +8729,10 @@ f_byte2line(argvars, rettv) - } - - /* - * "byteidx()" function - */ --/*ARGSUSED*/ - static void - f_byteidx(argvars, rettv) - typval_T *argvars; - typval_T *rettv; - { -@@ -8663,11 +8776,10 @@ f_call(argvars, rettv) - int argc = 0; - listitem_T *item; - int dummy; - dict_T *selfdict = NULL; - -- rettv->vval.v_number = 0; - if (argvars[1].v_type != VAR_LIST) - { - EMSG(_(e_listreq)); - return; - } -@@ -8735,14 +8847,13 @@ f_ceil(argvars, rettv) - #endif - - /* - * "changenr()" function - */ --/*ARGSUSED*/ - static void - f_changenr(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - rettv->vval.v_number = curbuf->b_u_seq_cur; - } - -@@ -8788,15 +8899,14 @@ f_cindent(argvars, rettv) - } - - /* - * "clearmatches()" function - */ --/*ARGSUSED*/ - static void - f_clearmatches(argvars, rettv) -- typval_T *argvars; -- typval_T *rettv; -+ typval_T *argvars UNUSED; -+ typval_T *rettv UNUSED; - { - #ifdef FEAT_SEARCH_EXTRA - clear_matches(curwin); - #endif - } -@@ -8856,15 +8966,14 @@ f_col(argvars, rettv) - - #if defined(FEAT_INS_EXPAND) - /* - * "complete()" function - */ --/*ARGSUSED*/ - static void - f_complete(argvars, rettv) - typval_T *argvars; -- typval_T *rettv; -+ typval_T *rettv UNUSED; - { - int startcol; - - if ((State & INSERT) == 0) - { -@@ -8891,11 +9000,10 @@ f_complete(argvars, rettv) - } - - /* - * "complete_add()" function - */ --/*ARGSUSED*/ - static void - f_complete_add(argvars, rettv) - typval_T *argvars; - typval_T *rettv; - { -@@ -8903,14 +9011,13 @@ f_complete_add(argvars, rettv) - } - - /* - * "complete_check()" function - */ --/*ARGSUSED*/ - static void - f_complete_check(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - int saved = RedrawingDisabled; - - RedrawingDisabled = 0; -@@ -8921,15 +9028,14 @@ f_complete_check(argvars, rettv) - #endif - - /* - * "confirm(message, buttons[, default [, type]])" function - */ --/*ARGSUSED*/ - static void - f_confirm(argvars, rettv) -- typval_T *argvars; -- typval_T *rettv; -+ typval_T *argvars UNUSED; -+ typval_T *rettv UNUSED; - { - #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG) - char_u *message; - char_u *buttons = NULL; - char_u buf[NUMBUFLEN]; -@@ -8971,17 +9077,13 @@ f_confirm(argvars, rettv) - } - - if (buttons == NULL || *buttons == NUL) - buttons = (char_u *)_("&Ok"); - -- if (error) -- rettv->vval.v_number = 0; -- else -+ if (!error) - rettv->vval.v_number = do_dialog(type, NULL, message, buttons, - def, NULL); --#else -- rettv->vval.v_number = 0; - #endif - } - - /* - * "copy()" function -@@ -9094,15 +9196,14 @@ f_count(argvars, rettv) - /* - * "cscope_connection([{num} , {dbpath} [, {prepend}]])" function - * - * Checks the existence of a cscope connection. - */ --/*ARGSUSED*/ - static void - f_cscope_connection(argvars, rettv) -- typval_T *argvars; -- typval_T *rettv; -+ typval_T *argvars UNUSED; -+ typval_T *rettv UNUSED; - { - #ifdef FEAT_CSCOPE - int num = 0; - char_u *dbpath = NULL; - char_u *prepend = NULL; -@@ -9116,31 +9217,30 @@ f_cscope_connection(argvars, rettv) - if (argvars[2].v_type != VAR_UNKNOWN) - prepend = get_tv_string_buf(&argvars[2], buf); - } - - rettv->vval.v_number = cs_connection(num, dbpath, prepend); --#else -- rettv->vval.v_number = 0; - #endif - } - - /* - * "cursor(lnum, col)" function - * -- * Moves the cursor to the specified line and column -+ * Moves the cursor to the specified line and column. -+ * Returns 0 when the position could be set, -1 otherwise. - */ --/*ARGSUSED*/ - static void - f_cursor(argvars, rettv) - typval_T *argvars; - typval_T *rettv; - { - long line, col; - #ifdef FEAT_VIRTUALEDIT - long coladd = 0; - #endif - -+ rettv->vval.v_number = -1; - if (argvars[1].v_type == VAR_UNKNOWN) - { - pos_T pos; - - if (list2fpos(argvars, &pos, NULL) == FAIL) -@@ -9181,10 +9281,11 @@ f_cursor(argvars, rettv) - if (has_mbyte) - mb_adjust_cursor(); - #endif - - curwin->w_set_curswant = TRUE; -+ rettv->vval.v_number = 0; - } - - /* - * "deepcopy()" function - */ -@@ -9198,11 +9299,14 @@ f_deepcopy(argvars, rettv) - if (argvars[1].v_type != VAR_UNKNOWN) - noref = get_tv_number_chk(&argvars[1], NULL); - if (noref < 0 || noref > 1) - EMSG(_(e_invarg)); - else -- item_copy(&argvars[0], rettv, TRUE, noref == 0 ? ++current_copyID : 0); -+ { -+ current_copyID += COPYID_INC; -+ item_copy(&argvars[0], rettv, TRUE, noref == 0 ? current_copyID : 0); -+ } - } - - /* - * "delete()" function - */ -@@ -9218,45 +9322,40 @@ f_delete(argvars, rettv) - } - - /* - * "did_filetype()" function - */ --/*ARGSUSED*/ - static void - f_did_filetype(argvars, rettv) -- typval_T *argvars; -- typval_T *rettv; -+ typval_T *argvars UNUSED; -+ typval_T *rettv UNUSED; - { - #ifdef FEAT_AUTOCMD - rettv->vval.v_number = did_filetype; --#else -- rettv->vval.v_number = 0; - #endif - } - - /* - * "diff_filler()" function - */ --/*ARGSUSED*/ - static void - f_diff_filler(argvars, rettv) -- typval_T *argvars; -- typval_T *rettv; -+ typval_T *argvars UNUSED; -+ typval_T *rettv UNUSED; - { - #ifdef FEAT_DIFF - rettv->vval.v_number = diff_check_fill(curwin, get_tv_lnum(argvars)); - #endif - } - - /* - * "diff_hlID()" function - */ --/*ARGSUSED*/ - static void - f_diff_hlID(argvars, rettv) -- typval_T *argvars; -- typval_T *rettv; -+ typval_T *argvars UNUSED; -+ typval_T *rettv UNUSED; - { - #ifdef FEAT_DIFF - linenr_T lnum = get_tv_lnum(argvars); - static linenr_T prev_lnum = 0; - static int changedtick = 0; -@@ -9365,11 +9464,10 @@ f_escape(argvars, rettv) - } - - /* - * "eval()" function - */ --/*ARGSUSED*/ - static void - f_eval(argvars, rettv) - typval_T *argvars; - typval_T *rettv; - { -@@ -9389,14 +9487,13 @@ f_eval(argvars, rettv) - } - - /* - * "eventhandler()" function - */ --/*ARGSUSED*/ - static void - f_eventhandler(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - rettv->vval.v_number = vgetc_busy; - } - -@@ -9516,11 +9613,11 @@ f_expand(argvars, rettv) - --emsg_off; - } - else - { - /* When the optional second argument is non-zero, don't remove matches -- * for 'suffixes' and 'wildignore' */ -+ * for 'wildignore' and don't put matches for 'suffixes' at the end. */ - if (argvars[1].v_type != VAR_UNKNOWN - && get_tv_number_chk(&argvars[1], &error)) - flags |= WILD_KEEP_ALL; - if (!error) - { -@@ -9540,11 +9637,10 @@ f_expand(argvars, rettv) - static void - f_extend(argvars, rettv) - typval_T *argvars; - typval_T *rettv; - { -- rettv->vval.v_number = 0; - if (argvars[0].v_type == VAR_LIST && argvars[1].v_type == VAR_LIST) - { - list_T *l1, *l2; - listitem_T *item; - long before; -@@ -9650,15 +9746,14 @@ f_extend(argvars, rettv) - } - - /* - * "feedkeys()" function - */ --/*ARGSUSED*/ - static void - f_feedkeys(argvars, rettv) - typval_T *argvars; -- typval_T *rettv; -+ typval_T *rettv UNUSED; - { - int remap = TRUE; - char_u *keys, *flags; - char_u nbuf[NUMBUFLEN]; - int typed = FALSE; -@@ -9668,11 +9763,10 @@ f_feedkeys(argvars, rettv) - * executed in the sandbox it would be OK, but it probably happens later, - * when "sandbox" is no longer set. */ - if (check_secure()) - return; - -- rettv->vval.v_number = 0; - keys = get_tv_string(&argvars[0]); - if (*keys != NUL) - { - if (argvars[1].v_type != VAR_UNKNOWN) - { -@@ -9835,12 +9929,12 @@ filter_map(argvars, rettv, map) - typval_T save_key; - int rem; - int todo; - char_u *ermsg = map ? (char_u *)"map()" : (char_u *)"filter()"; - int save_did_emsg; -+ int index = 0; - -- rettv->vval.v_number = 0; - if (argvars[0].v_type == VAR_LIST) - { - if ((l = argvars[0].vval.v_list) == NULL - || (map && tv_check_lock(l->lv_lock, ermsg))) - return; -@@ -9869,13 +9963,13 @@ filter_map(argvars, rettv, map) - /* We reset "did_emsg" to be able to detect whether an error - * occurred during evaluation of the expression. */ - save_did_emsg = did_emsg; - did_emsg = FALSE; - -+ prepare_vimvar(VV_KEY, &save_key); - if (argvars[0].v_type == VAR_DICT) - { -- prepare_vimvar(VV_KEY, &save_key); - vimvars[VV_KEY].vv_type = VAR_STRING; - - ht = &d->dv_hashtab; - hash_lock(ht); - todo = (int)ht->ht_used; -@@ -9895,28 +9989,31 @@ filter_map(argvars, rettv, map) - dictitem_remove(d, di); - clear_tv(&vimvars[VV_KEY].vv_tv); - } - } - hash_unlock(ht); -- -- restore_vimvar(VV_KEY, &save_key); - } - else - { -+ vimvars[VV_KEY].vv_type = VAR_NUMBER; -+ - for (li = l->lv_first; li != NULL; li = nli) - { - if (tv_check_lock(li->li_tv.v_lock, ermsg)) - break; - nli = li->li_next; -+ vimvars[VV_KEY].vv_nr = index; - if (filter_map_one(&li->li_tv, expr, map, &rem) == FAIL - || did_emsg) - break; - if (!map && rem) - listitem_remove(l, li); -+ ++index; - } - } - -+ restore_vimvar(VV_KEY, &save_key); - restore_vimvar(VV_VAL, &save_val); - - did_emsg |= save_did_emsg; - } - -@@ -10019,12 +10116,10 @@ f_float2nr(argvars, rettv) - else if (f > 0x7fffffff) - rettv->vval.v_number = 0x7fffffff; - else - rettv->vval.v_number = (varnumber_T)f; - } -- else -- rettv->vval.v_number = 0; - } - - /* - * "floor({float})" function - */ -@@ -10154,22 +10249,19 @@ f_foldlevel(argvars, rettv) - linenr_T lnum; - - lnum = get_tv_lnum(argvars); - if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) - rettv->vval.v_number = foldLevel(lnum); -- else - #endif -- rettv->vval.v_number = 0; - } - - /* - * "foldtext()" function - */ --/*ARGSUSED*/ - static void - f_foldtext(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - #ifdef FEAT_FOLDING - linenr_T lnum; - char_u *s; -@@ -10230,14 +10322,13 @@ f_foldtext(argvars, rettv) - } - - /* - * "foldtextresult(lnum)" function - */ --/*ARGSUSED*/ - static void - f_foldtextresult(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - #ifdef FEAT_FOLDING - linenr_T lnum; - char_u *text; -@@ -10266,17 +10357,15 @@ f_foldtextresult(argvars, rettv) - } - - /* - * "foreground()" function - */ --/*ARGSUSED*/ - static void - f_foreground(argvars, rettv) -- typval_T *argvars; -- typval_T *rettv; -+ typval_T *argvars UNUSED; -+ typval_T *rettv UNUSED; - { -- rettv->vval.v_number = 0; - #ifdef FEAT_GUI - if (gui.in_use) - gui_mch_set_foreground(); - #else - # ifdef WIN32 -@@ -10286,23 +10375,22 @@ f_foreground(argvars, rettv) - } - - /* - * "function()" function - */ --/*ARGSUSED*/ - static void - f_function(argvars, rettv) - typval_T *argvars; - typval_T *rettv; - { - char_u *s; - -- rettv->vval.v_number = 0; - s = get_tv_string(&argvars[0]); - if (s == NULL || *s == NUL || VIM_ISDIGIT(*s)) - EMSG2(_(e_invarg2), s); -- else if (!function_exists(s)) -+ /* Don't check an autoload name for existence here. */ -+ else if (vim_strchr(s, AUTOLOAD_CHAR) == NULL && !function_exists(s)) - EMSG2(_("E700: Unknown function: %s"), s); - else - { - rettv->vval.v_string = vim_strsave(s); - rettv->v_type = VAR_FUNC; -@@ -10310,15 +10398,14 @@ f_function(argvars, rettv) - } - - /* - * "garbagecollect()" function - */ --/*ARGSUSED*/ - static void - f_garbagecollect(argvars, rettv) - typval_T *argvars; -- typval_T *rettv; -+ typval_T *rettv UNUSED; - { - /* This is postponed until we are back at the toplevel, because we may be - * using Lists and Dicts internally. E.g.: ":echo [garbagecollect()]". */ - want_garbage_collect = TRUE; - -@@ -10363,13 +10450,11 @@ f_get(argvars, rettv) - else - EMSG2(_(e_listdictarg), "get()"); - - if (tv == NULL) - { -- if (argvars[2].v_type == VAR_UNKNOWN) -- rettv->vval.v_number = 0; -- else -+ if (argvars[2].v_type != VAR_UNKNOWN) - copy_tv(&argvars[2], rettv); - } - else - copy_tv(tv, rettv); - } -@@ -10390,17 +10475,12 @@ get_buffer_lines(buf, start, end, retlis - int retlist; - typval_T *rettv; - { - char_u *p; - -- if (retlist) -- { -- if (rettv_list_alloc(rettv) == FAIL) -- return; -- } -- else -- rettv->vval.v_number = 0; -+ if (retlist && rettv_list_alloc(rettv) == FAIL) -+ return; - - if (buf == NULL || buf->b_ml.ml_mfp == NULL || start < 0) - return; - - if (!retlist) -@@ -10600,23 +10680,23 @@ f_getchar(argvars, rettv) - win_T *win; - linenr_T lnum; - # ifdef FEAT_WINDOWS - win_T *wp; - # endif -- int n = 1; -+ int winnr = 1; - - if (row >= 0 && col >= 0) - { - /* Find the window at the mouse coordinates and compute the - * text position. */ - win = mouse_find_win(&row, &col); - (void)mouse_comp_pos(win, &row, &col, &lnum); - # ifdef FEAT_WINDOWS - for (wp = firstwin; wp != win; wp = wp->w_next) -- ++n; -+ ++winnr; - # endif -- vimvars[VV_MOUSE_WIN].vv_nr = n; -+ vimvars[VV_MOUSE_WIN].vv_nr = winnr; - vimvars[VV_MOUSE_LNUM].vv_nr = lnum; - vimvars[VV_MOUSE_COL].vv_nr = col + 1; - } - } - #endif -@@ -10624,51 +10704,47 @@ f_getchar(argvars, rettv) - } - - /* - * "getcharmod()" function - */ --/*ARGSUSED*/ - static void - f_getcharmod(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - rettv->vval.v_number = mod_mask; - } - - /* - * "getcmdline()" function - */ --/*ARGSUSED*/ - static void - f_getcmdline(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - rettv->v_type = VAR_STRING; - rettv->vval.v_string = get_cmdline_str(); - } - - /* - * "getcmdpos()" function - */ --/*ARGSUSED*/ - static void - f_getcmdpos(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - rettv->vval.v_number = get_cmdline_pos() + 1; - } - - /* - * "getcmdtype()" function - */ --/*ARGSUSED*/ - static void - f_getcmdtype(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - rettv->v_type = VAR_STRING; - rettv->vval.v_string = alloc(2); - if (rettv->vval.v_string != NULL) -@@ -10679,14 +10755,13 @@ f_getcmdtype(argvars, rettv) - } - - /* - * "getcwd()" function - */ --/*ARGSUSED*/ - static void - f_getcwd(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - char_u cwd[MAXPATHL]; - - rettv->v_type = VAR_STRING; -@@ -10703,14 +10778,13 @@ f_getcwd(argvars, rettv) - } - - /* - * "getfontname()" function - */ --/*ARGSUSED*/ - static void - f_getfontname(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - rettv->v_type = VAR_STRING; - rettv->vval.v_string = NULL; - #ifdef FEAT_GUI -@@ -10933,22 +11007,19 @@ f_getline(argvars, rettv) - } - - /* - * "getmatches()" function - */ --/*ARGSUSED*/ - static void - f_getmatches(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - #ifdef FEAT_SEARCH_EXTRA - dict_T *dict; - matchitem_T *cur = curwin->w_match_head; - -- rettv->vval.v_number = 0; -- - if (rettv_list_alloc(rettv) == OK) - { - while (cur != NULL) - { - dict = dict_alloc(); -@@ -10966,14 +11037,13 @@ f_getmatches(argvars, rettv) - } - - /* - * "getpid()" function - */ --/*ARGSUSED*/ - static void - f_getpid(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - rettv->vval.v_number = mch_get_pid(); - } - -@@ -11013,21 +11083,19 @@ f_getpos(argvars, rettv) - } - - /* - * "getqflist()" and "getloclist()" functions - */ --/*ARGSUSED*/ - static void - f_getqflist(argvars, rettv) -- typval_T *argvars; -- typval_T *rettv; -+ typval_T *argvars UNUSED; -+ typval_T *rettv UNUSED; - { - #ifdef FEAT_QUICKFIX - win_T *wp; - #endif - -- rettv->vval.v_number = 0; - #ifdef FEAT_QUICKFIX - if (rettv_list_alloc(rettv) == OK) - { - wp = NULL; - if (argvars[0].v_type != VAR_UNKNOWN) /* getloclist() */ -@@ -11133,14 +11201,13 @@ f_gettabwinvar(argvars, rettv) - } - - /* - * "getwinposx()" function - */ --/*ARGSUSED*/ - static void - f_getwinposx(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - rettv->vval.v_number = -1; - #ifdef FEAT_GUI - if (gui.in_use) -@@ -11154,14 +11221,13 @@ f_getwinposx(argvars, rettv) - } - - /* - * "getwinposy()" function - */ --/*ARGSUSED*/ - static void - f_getwinposy(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - rettv->vval.v_number = -1; - #ifdef FEAT_GUI - if (gui.in_use) -@@ -11282,35 +11348,55 @@ getwinvar(argvars, rettv, off) - static void - f_glob(argvars, rettv) - typval_T *argvars; - typval_T *rettv; - { -+ int flags = WILD_SILENT|WILD_USE_NL; - expand_T xpc; -+ int error = FALSE; - -- ExpandInit(&xpc); -- xpc.xp_context = EXPAND_FILES; -+ /* When the optional second argument is non-zero, don't remove matches -+ * for 'wildignore' and don't put matches for 'suffixes' at the end. */ -+ if (argvars[1].v_type != VAR_UNKNOWN -+ && get_tv_number_chk(&argvars[1], &error)) -+ flags |= WILD_KEEP_ALL; - rettv->v_type = VAR_STRING; -- rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]), -- NULL, WILD_USE_NL|WILD_SILENT, WILD_ALL); -+ if (!error) -+ { -+ ExpandInit(&xpc); -+ xpc.xp_context = EXPAND_FILES; -+ rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]), -+ NULL, flags, WILD_ALL); -+ } -+ else -+ rettv->vval.v_string = NULL; - } - - /* - * "globpath()" function - */ - static void - f_globpath(argvars, rettv) - typval_T *argvars; - typval_T *rettv; - { -+ int flags = 0; - char_u buf1[NUMBUFLEN]; - char_u *file = get_tv_string_buf_chk(&argvars[1], buf1); -+ int error = FALSE; - -+ /* When the optional second argument is non-zero, don't remove matches -+ * for 'wildignore' and don't put matches for 'suffixes' at the end. */ -+ if (argvars[2].v_type != VAR_UNKNOWN -+ && get_tv_number_chk(&argvars[2], &error)) -+ flags |= WILD_KEEP_ALL; - rettv->v_type = VAR_STRING; -- if (file == NULL) -+ if (file == NULL || error) - rettv->vval.v_string = NULL; - else -- rettv->vval.v_string = globpath(get_tv_string(&argvars[0]), file); -+ rettv->vval.v_string = globpath(get_tv_string(&argvars[0]), file, -+ flags); - } - - /* - * "has()" function - */ -@@ -11368,11 +11454,11 @@ f_has(argvars, rettv) - "win32", - #endif - #if defined(UNIX) && (defined(__CYGWIN32__) || defined(__CYGWIN__)) - "win32unix", - #endif --#ifdef WIN64 -+#if defined(WIN64) || defined(_WIN64) - "win64", - #endif - #ifdef EBCDIC - "ebcdic", - #endif -@@ -11655,10 +11741,13 @@ f_has(argvars, rettv) - "smartindent", - #endif - #ifdef FEAT_SNIFF - "sniff", - #endif -+#ifdef STARTUPTIME -+ "startuptime", -+#endif - #ifdef FEAT_STL_OPT - "statusline", - #endif - #ifdef FEAT_SUN_WORKSHOP - "sun_workshop", -@@ -11780,10 +11869,14 @@ f_has(argvars, rettv) - { - if (STRNICMP(name, "patch", 5) == 0) - n = has_patch(atoi((char *)name + 5)); - else if (STRICMP(name, "vim_starting") == 0) - n = (starting != 0); -+#ifdef FEAT_MBYTE -+ else if (STRICMP(name, "multi_byte_encoding") == 0) -+ n = has_mbyte; -+#endif - #if defined(FEAT_BEVAL) && defined(FEAT_GUI_W32) - else if (STRICMP(name, "balloon_multiline") == 0) - n = multiline_balloon_available(); - #endif - #ifdef DYNAMIC_TCL -@@ -11845,11 +11938,10 @@ f_has(argvars, rettv) - static void - f_has_key(argvars, rettv) - typval_T *argvars; - typval_T *rettv; - { -- rettv->vval.v_number = 0; - if (argvars[0].v_type != VAR_DICT) - { - EMSG(_(e_dictreq)); - return; - } -@@ -11861,14 +11953,13 @@ f_has_key(argvars, rettv) - } - - /* - * "haslocaldir()" function - */ --/*ARGSUSED*/ - static void - f_haslocaldir(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - rettv->vval.v_number = (curwin->w_localdir != NULL); - } - -@@ -11902,14 +11993,13 @@ f_hasmapto(argvars, rettv) - } - - /* - * "histadd()" function - */ --/*ARGSUSED*/ - static void - f_histadd(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - #ifdef FEAT_CMDHIST - int histype; - char_u *str; -@@ -11925,10 +12015,11 @@ f_histadd(argvars, rettv) - if (histype >= 0) - { - str = get_tv_string_buf(&argvars[1], buf); - if (*str != NUL) - { -+ init_history(); - add_to_history(histype, str, FALSE, NUL); - rettv->vval.v_number = TRUE; - return; - } - } -@@ -11936,15 +12027,14 @@ f_histadd(argvars, rettv) - } - - /* - * "histdel()" function - */ --/*ARGSUSED*/ - static void - f_histdel(argvars, rettv) -- typval_T *argvars; -- typval_T *rettv; -+ typval_T *argvars UNUSED; -+ typval_T *rettv UNUSED; - { - #ifdef FEAT_CMDHIST - int n; - char_u buf[NUMBUFLEN]; - char_u *str; -@@ -11962,22 +12052,19 @@ f_histdel(argvars, rettv) - else - /* string given: remove all matching entries */ - n = del_history_entry(get_histtype(str), - get_tv_string_buf(&argvars[1], buf)); - rettv->vval.v_number = n; --#else -- rettv->vval.v_number = 0; - #endif - } - - /* - * "histget()" function - */ --/*ARGSUSED*/ - static void - f_histget(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - #ifdef FEAT_CMDHIST - int type; - int idx; -@@ -12003,14 +12090,13 @@ f_histget(argvars, rettv) - } - - /* - * "histnr()" function - */ --/*ARGSUSED*/ - static void - f_histnr(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - int i; - - #ifdef FEAT_CMDHIST -@@ -12048,14 +12134,13 @@ f_hlexists(argvars, rettv) - } - - /* - * "hostname()" function - */ --/*ARGSUSED*/ - static void - f_hostname(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - char_u hostname[256]; - - mch_get_host_name(hostname, 256); -@@ -12064,14 +12149,13 @@ f_hostname(argvars, rettv) - } - - /* - * iconv() function - */ --/*ARGSUSED*/ - static void - f_iconv(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - #ifdef FEAT_MBYTE - char_u buf1[NUMBUFLEN]; - char_u buf2[NUMBUFLEN]; -@@ -12325,11 +12409,10 @@ f_inputlist(argvars, rettv) - { - listitem_T *li; - int selected; - int mouse_used; - -- rettv->vval.v_number = 0; - #ifdef NO_CONSOLE_INPUT - /* While starting up, there is no place to enter text. */ - if (no_console_input()) - return; - #endif -@@ -12363,22 +12446,21 @@ f_inputlist(argvars, rettv) - static garray_T ga_userinput = {0, 0, sizeof(tasave_T), 4, NULL}; - - /* - * "inputrestore()" function - */ --/*ARGSUSED*/ - static void - f_inputrestore(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - if (ga_userinput.ga_len > 0) - { - --ga_userinput.ga_len; - restore_typeahead((tasave_T *)(ga_userinput.ga_data) - + ga_userinput.ga_len); -- rettv->vval.v_number = 0; /* OK */ -+ /* default return is zero == OK */ - } - else if (p_verbose > 1) - { - verb_msg((char_u *)_("called inputrestore() more often than inputsave()")); - rettv->vval.v_number = 1; /* Failed */ -@@ -12386,23 +12468,22 @@ f_inputrestore(argvars, rettv) - } - - /* - * "inputsave()" function - */ --/*ARGSUSED*/ - static void - f_inputsave(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - /* Add an entry to the stack of typeahead storage. */ - if (ga_grow(&ga_userinput, 1) == OK) - { - save_typeahead((tasave_T *)(ga_userinput.ga_data) - + ga_userinput.ga_len); - ++ga_userinput.ga_len; -- rettv->vval.v_number = 0; /* OK */ -+ /* default return is zero == OK */ - } - else - rettv->vval.v_number = 1; /* Failed */ - } - -@@ -12432,11 +12513,10 @@ f_insert(argvars, rettv) - long before = 0; - listitem_T *item; - list_T *l; - int error = FALSE; - -- rettv->vval.v_number = 0; - if (argvars[0].v_type != VAR_LIST) - EMSG2(_(e_listarg), "insert()"); - else if ((l = argvars[0].vval.v_list) != NULL - && !tv_check_lock(l->lv_lock, (char_u *)"insert()")) - { -@@ -12551,11 +12631,10 @@ dict_list(argvars, rettv, what) - listitem_T *li; - listitem_T *li2; - dict_T *d; - int todo; - -- rettv->vval.v_number = 0; - if (argvars[0].v_type != VAR_DICT) - { - EMSG(_(e_dictreq)); - return; - } -@@ -12639,11 +12718,10 @@ f_join(argvars, rettv) - typval_T *rettv; - { - garray_T ga; - char_u *sep; - -- rettv->vval.v_number = 0; - if (argvars[0].v_type != VAR_LIST) - { - EMSG(_(e_listreq)); - return; - } -@@ -12679,14 +12757,13 @@ f_keys(argvars, rettv) - } - - /* - * "last_buffer_nr()" function. - */ --/*ARGSUSED*/ - static void - f_last_buffer_nr(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - int n = 0; - buf_T *buf; - -@@ -12737,13 +12814,11 @@ libcall_common(argvars, rettv, type) - char_u **string_result; - int nr_result; - #endif - - rettv->v_type = type; -- if (type == VAR_NUMBER) -- rettv->vval.v_number = 0; -- else -+ if (type != VAR_NUMBER) - rettv->vval.v_string = NULL; - - if (check_restricted() || check_secure()) - return; - -@@ -12811,14 +12886,13 @@ f_line(argvars, rettv) - } - - /* - * "line2byte(lnum)" function - */ --/*ARGSUSED*/ - static void - f_line2byte(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - #ifndef FEAT_BYTEOFF - rettv->vval.v_number = -1; - #else -@@ -12860,14 +12934,13 @@ f_lispindent(argvars, rettv) - } - - /* - * "localtime()" function - */ --/*ARGSUSED*/ - static void - f_localtime(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - rettv->vval.v_number = (varnumber_T)time(NULL); - } - -@@ -13445,11 +13518,10 @@ f_mkdir(argvars, rettv) - #endif - - /* - * "mode()" function - */ --/*ARGSUSED*/ - static void - f_mode(argvars, rettv) - typval_T *argvars; - typval_T *rettv; - { -@@ -13519,10 +13591,27 @@ f_mode(argvars, rettv) - - rettv->vval.v_string = vim_strsave(buf); - rettv->v_type = VAR_STRING; - } - -+#ifdef FEAT_MZSCHEME -+/* -+ * "mzeval()" function -+ */ -+ static void -+f_mzeval(argvars, rettv) -+ typval_T *argvars; -+ typval_T *rettv; -+{ -+ char_u *str; -+ char_u buf[NUMBUFLEN]; -+ -+ str = get_tv_string_buf(&argvars[0], buf); -+ do_mzeval(str, rettv); -+} -+#endif -+ - /* - * "nextnonblank()" function - */ - static void - f_nextnonblank(argvars, rettv) -@@ -13674,17 +13763,15 @@ f_printf(argvars, rettv) - } - - /* - * "pumvisible()" function - */ --/*ARGSUSED*/ - static void - f_pumvisible(argvars, rettv) -- typval_T *argvars; -- typval_T *rettv; -+ typval_T *argvars UNUSED; -+ typval_T *rettv UNUSED; - { -- rettv->vval.v_number = 0; - #ifdef FEAT_INS_EXPAND - if (pum_visible()) - rettv->vval.v_number = 1; - #endif - } -@@ -13714,11 +13801,10 @@ f_range(argvars, rettv) - end = get_tv_number_chk(&argvars[1], &error); - if (argvars[2].v_type != VAR_UNKNOWN) - stride = get_tv_number_chk(&argvars[2], &error); - } - -- rettv->vval.v_number = 0; - if (error) - return; /* type error; errmsg already given */ - if (stride == 0) - EMSG(_("E726: Stride is zero")); - else if (stride > 0 ? end + 1 < start : end - 1 > start) -@@ -14081,14 +14167,13 @@ remote_common(argvars, rettv, expr) - #endif - - /* - * "remote_expr()" function - */ --/*ARGSUSED*/ - static void - f_remote_expr(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - rettv->v_type = VAR_STRING; - rettv->vval.v_string = NULL; - #ifdef FEAT_CLIENTSERVER -@@ -14097,17 +14182,15 @@ f_remote_expr(argvars, rettv) - } - - /* - * "remote_foreground()" function - */ --/*ARGSUSED*/ - static void - f_remote_foreground(argvars, rettv) -- typval_T *argvars; -- typval_T *rettv; -+ typval_T *argvars UNUSED; -+ typval_T *rettv UNUSED; - { -- rettv->vval.v_number = 0; - #ifdef FEAT_CLIENTSERVER - # ifdef WIN32 - /* On Win32 it's done in this application. */ - { - char_u *server_name = get_tv_string_chk(&argvars[0]); -@@ -14124,14 +14207,13 @@ f_remote_foreground(argvars, rettv) - vim_free(argvars[1].vval.v_string); - # endif - #endif - } - --/*ARGSUSED*/ - static void - f_remote_peek(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - #ifdef FEAT_CLIENTSERVER - dictitem_T v; - char_u *s = NULL; -@@ -14159,11 +14241,10 @@ f_remote_peek(argvars, rettv) - { - s = serverGetReply((HWND)n, FALSE, FALSE, FALSE); - rettv->vval.v_number = (s != NULL); - } - # else -- rettv->vval.v_number = 0; - if (check_connection() == FAIL) - return; - - rettv->vval.v_number = serverPeekReply(X_DISPLAY, - serverStrToWin(serverid), &s); -@@ -14183,14 +14264,13 @@ f_remote_peek(argvars, rettv) - #else - rettv->vval.v_number = -1; - #endif - } - --/*ARGSUSED*/ - static void - f_remote_read(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - char_u *r = NULL; - - #ifdef FEAT_CLIENTSERVER -@@ -14218,14 +14298,13 @@ f_remote_read(argvars, rettv) - } - - /* - * "remote_send()" function - */ --/*ARGSUSED*/ - static void - f_remote_send(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - rettv->v_type = VAR_STRING; - rettv->vval.v_string = NULL; - #ifdef FEAT_CLIENTSERVER -@@ -14248,11 +14327,10 @@ f_remove(argvars, rettv) - long end; - char_u *key; - dict_T *d; - dictitem_T *di; - -- rettv->vval.v_number = 0; - if (argvars[0].v_type == VAR_DICT) - { - if (argvars[2].v_type != VAR_UNKNOWN) - EMSG2(_(e_toomanyarg), "remove()"); - else if ((d = argvars[0].vval.v_dict) != NULL -@@ -14351,11 +14429,10 @@ f_rename(argvars, rettv) - } - - /* - * "repeat()" function - */ --/*ARGSUSED*/ - static void - f_repeat(argvars, rettv) - typval_T *argvars; - typval_T *rettv; - { -@@ -14606,11 +14683,10 @@ f_reverse(argvars, rettv) - typval_T *rettv; - { - list_T *l; - listitem_T *li, *ni; - -- rettv->vval.v_number = 0; - if (argvars[0].v_type != VAR_LIST) - EMSG2(_(e_listarg), "reverse()"); - else if ((l = argvars[0].vval.v_list) != NULL - && !tv_check_lock(l->lv_lock, (char_u *)"reverse()")) - { -@@ -14958,12 +15034,10 @@ f_searchpairpos(argvars, rettv) - { - pos_T match_pos; - int lnum = 0; - int col = 0; - -- rettv->vval.v_number = 0; -- - if (rettv_list_alloc(rettv) == FAIL) - return; - - if (searchpair_cmn(argvars, &match_pos) > 0) - { -@@ -15146,12 +15220,10 @@ f_searchpos(argvars, rettv) - int lnum = 0; - int col = 0; - int n; - int flags = 0; - -- rettv->vval.v_number = 0; -- - if (rettv_list_alloc(rettv) == FAIL) - return; - - n = search_cmn(argvars, &match_pos, &flags); - if (n > 0) -@@ -15165,14 +15237,13 @@ f_searchpos(argvars, rettv) - if (flags & SP_SUBPAT) - list_append_number(rettv->vval.v_list, (varnumber_T)n); - } - - --/*ARGSUSED*/ - static void - f_server2client(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - #ifdef FEAT_CLIENTSERVER - char_u buf[NUMBUFLEN]; - char_u *server = get_tv_string_chk(&argvars[0]); -@@ -15197,14 +15268,13 @@ f_server2client(argvars, rettv) - #else - rettv->vval.v_number = -1; - #endif - } - --/*ARGSUSED*/ - static void - f_serverlist(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - char_u *r = NULL; - - #ifdef FEAT_CLIENTSERVER -@@ -15221,24 +15291,21 @@ f_serverlist(argvars, rettv) - } - - /* - * "setbufvar()" function - */ --/*ARGSUSED*/ - static void - f_setbufvar(argvars, rettv) - typval_T *argvars; -- typval_T *rettv; -+ typval_T *rettv UNUSED; - { - buf_T *buf; - aco_save_T aco; - char_u *varname, *bufvarname; - typval_T *varp; - char_u nbuf[NUMBUFLEN]; - -- rettv->vval.v_number = 0; -- - if (check_restricted() || check_secure()) - return; - (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */ - varname = get_tv_string_chk(&argvars[1]); - buf = get_buf_tv(&argvars[0]); -@@ -15314,11 +15381,11 @@ f_setline(argvars, rettv) - li = l->lv_first; - } - else - line = get_tv_string_chk(&argvars[1]); - -- rettv->vval.v_number = 0; /* OK */ -+ /* default result is zero == OK */ - for (;;) - { - if (l != NULL) - { - /* list argument, get next string */ -@@ -15362,16 +15429,15 @@ f_setline(argvars, rettv) - static void set_qf_ll_list __ARGS((win_T *wp, typval_T *list_arg, typval_T *action_arg, typval_T *rettv)); - - /* - * Used by "setqflist()" and "setloclist()" functions - */ --/*ARGSUSED*/ - static void - set_qf_ll_list(wp, list_arg, action_arg, rettv) -- win_T *wp; -- typval_T *list_arg; -- typval_T *action_arg; -+ win_T *wp UNUSED; -+ typval_T *list_arg UNUSED; -+ typval_T *action_arg UNUSED; - typval_T *rettv; - { - #ifdef FEAT_QUICKFIX - char_u *act; - int action = ' '; -@@ -15402,11 +15468,10 @@ set_qf_ll_list(wp, list_arg, action_arg, - } - - /* - * "setloclist()" function - */ --/*ARGSUSED*/ - static void - f_setloclist(argvars, rettv) - typval_T *argvars; - typval_T *rettv; - { -@@ -15480,11 +15545,10 @@ f_setmatches(argvars, rettv) - } - - /* - * "setpos()" function - */ --/*ARGSUSED*/ - static void - f_setpos(argvars, rettv) - typval_T *argvars; - typval_T *rettv; - { -@@ -15496,11 +15560,12 @@ f_setpos(argvars, rettv) - name = get_tv_string_chk(argvars); - if (name != NULL) - { - if (list2fpos(&argvars[1], &pos, &fnum) == OK) - { -- --pos.col; -+ if (--pos.col < 0) -+ pos.col = 0; - if (name[0] == '.' && name[1] == NUL) - { - /* set cursor */ - if (fnum == curbuf->b_fnum) - { -@@ -15524,11 +15589,10 @@ f_setpos(argvars, rettv) - } - - /* - * "setqflist()" function - */ --/*ARGSUSED*/ - static void - f_setqflist(argvars, rettv) - typval_T *argvars; - typval_T *rettv; - { -@@ -15630,11 +15694,11 @@ f_setwinvar(argvars, rettv) - * "setwinvar()" and "settabwinvar()" functions - */ - static void - setwinvar(argvars, rettv, off) - typval_T *argvars; -- typval_T *rettv; -+ typval_T *rettv UNUSED; - int off; - { - win_T *win; - #ifdef FEAT_WINDOWS - win_T *save_curwin; -@@ -15643,12 +15707,10 @@ setwinvar(argvars, rettv, off) - char_u *varname, *winvarname; - typval_T *varp; - char_u nbuf[NUMBUFLEN]; - tabpage_T *tp; - -- rettv->vval.v_number = 0; -- - if (check_restricted() || check_secure()) - return; - - #ifdef FEAT_WINDOWS - if (off == 1) -@@ -15836,14 +15898,13 @@ item_compare2(s1, s2) - clear_tv(&argv[1]); - - if (res == FAIL) - res = ITEM_COMPARE_FAIL; - else -- /* return value has wrong type */ - res = get_tv_number_chk(&rettv, &item_compare_func_err); - if (item_compare_func_err) -- res = ITEM_COMPARE_FAIL; -+ res = ITEM_COMPARE_FAIL; /* return value has wrong type */ - clear_tv(&rettv); - return res; - } - - /* -@@ -15858,11 +15919,10 @@ f_sort(argvars, rettv) - listitem_T *li; - listitem_T **ptrs; - long len; - long i; - -- rettv->vval.v_number = 0; - if (argvars[0].v_type != VAR_LIST) - EMSG2(_(e_listarg), "sort()"); - else - { - l = argvars[0].vval.v_list; -@@ -15950,14 +16010,13 @@ f_soundfold(argvars, rettv) - } - - /* - * "spellbadword()" function - */ --/* ARGSUSED */ - static void - f_spellbadword(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - char_u *word = (char_u *)""; - hlf_T attr = HLF_COUNT; - int len = 0; -@@ -16005,14 +16064,13 @@ f_spellbadword(argvars, rettv) - } - - /* - * "spellsuggest()" function - */ --/*ARGSUSED*/ - static void - f_spellsuggest(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - #ifdef FEAT_SPELL - char_u *str; - int typeerr = FALSE; -@@ -16491,14 +16549,13 @@ f_substitute(argvars, rettv) - } - - /* - * "synID(lnum, col, trans)" function - */ --/*ARGSUSED*/ - static void - f_synID(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - int id = 0; - #ifdef FEAT_SYN_HL - long lnum; -@@ -16519,14 +16576,13 @@ f_synID(argvars, rettv) - } - - /* - * "synIDattr(id, what [, mode])" function - */ --/*ARGSUSED*/ - static void - f_synIDattr(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - char_u *p = NULL; - #ifdef FEAT_SYN_HL - int id; -@@ -16569,11 +16625,11 @@ f_synIDattr(argvars, rettv) - p = highlight_color(id, what, modec); - else /* bold */ - p = highlight_has_attr(id, HL_BOLD, modec); - break; - -- case 'f': /* fg[#] */ -+ case 'f': /* fg[#] or font */ - p = highlight_color(id, what, modec); - break; - - case 'i': - if (TOLOWER_ASC(what[1]) == 'n') /* inverse */ -@@ -16588,12 +16644,15 @@ f_synIDattr(argvars, rettv) - - case 'r': /* reverse */ - p = highlight_has_attr(id, HL_INVERSE, modec); - break; - -- case 's': /* standout */ -- p = highlight_has_attr(id, HL_STANDOUT, modec); -+ case 's': -+ if (TOLOWER_ASC(what[1]) == 'p') /* sp[#] */ -+ p = highlight_color(id, what, modec); -+ else /* standout */ -+ p = highlight_has_attr(id, HL_STANDOUT, modec); - break; - - case 'u': - if (STRLEN(what) <= 5 || TOLOWER_ASC(what[5]) != 'c') - /* underline */ -@@ -16612,14 +16671,13 @@ f_synIDattr(argvars, rettv) - } - - /* - * "synIDtrans(id)" function - */ --/*ARGSUSED*/ - static void - f_synIDtrans(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - int id; - - #ifdef FEAT_SYN_HL -@@ -16635,14 +16693,13 @@ f_synIDtrans(argvars, rettv) - } - - /* - * "synstack(lnum, col)" function - */ --/*ARGSUSED*/ - static void - f_synstack(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - #ifdef FEAT_SYN_HL - long lnum; - long col; -@@ -16656,11 +16713,11 @@ f_synstack(argvars, rettv) - #ifdef FEAT_SYN_HL - lnum = get_tv_lnum(argvars); /* -1 on type error */ - col = get_tv_number(&argvars[1]) - 1; /* -1 on type error */ - - if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count -- && col >= 0 && col < (long)STRLEN(ml_get(lnum)) -+ && col >= 0 && (col == 0 || col < (long)STRLEN(ml_get(lnum))) - && rettv_list_alloc(rettv) != FAIL) - { - (void)syn_get_id(curwin, lnum, (colnr_T)col, FALSE, NULL, TRUE); - for (i = 0; ; ++i) - { -@@ -16772,19 +16829,16 @@ done: - } - - /* - * "tabpagebuflist()" function - */ --/* ARGSUSED */ - static void - f_tabpagebuflist(argvars, rettv) -- typval_T *argvars; -- typval_T *rettv; -+ typval_T *argvars UNUSED; -+ typval_T *rettv UNUSED; - { --#ifndef FEAT_WINDOWS -- rettv->vval.v_number = 0; --#else -+#ifdef FEAT_WINDOWS - tabpage_T *tp; - win_T *wp = NULL; - - if (argvars[0].v_type == VAR_UNKNOWN) - wp = firstwin; -@@ -16792,35 +16846,27 @@ f_tabpagebuflist(argvars, rettv) - { - tp = find_tabpage((int)get_tv_number(&argvars[0])); - if (tp != NULL) - wp = (tp == curtab) ? firstwin : tp->tp_firstwin; - } -- if (wp == NULL) -- rettv->vval.v_number = 0; -- else -+ if (wp != NULL && rettv_list_alloc(rettv) != FAIL) - { -- if (rettv_list_alloc(rettv) == FAIL) -- rettv->vval.v_number = 0; -- else -- { -- for (; wp != NULL; wp = wp->w_next) -- if (list_append_number(rettv->vval.v_list, -+ for (; wp != NULL; wp = wp->w_next) -+ if (list_append_number(rettv->vval.v_list, - wp->w_buffer->b_fnum) == FAIL) -- break; -- } -+ break; - } - #endif - } - - - /* - * "tabpagenr()" function - */ --/* ARGSUSED */ - static void - f_tabpagenr(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - int nr = 1; - #ifdef FEAT_WINDOWS - char_u *arg; -@@ -16898,14 +16944,13 @@ get_winnr(tp, argvar) - #endif - - /* - * "tabpagewinnr()" function - */ --/* ARGSUSED */ - static void - f_tabpagewinnr(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - int nr = 1; - #ifdef FEAT_WINDOWS - tabpage_T *tp; -@@ -16921,25 +16966,21 @@ f_tabpagewinnr(argvars, rettv) - - - /* - * "tagfiles()" function - */ --/*ARGSUSED*/ - static void - f_tagfiles(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - char_u fname[MAXPATHL + 1]; - tagname_T tn; - int first; - - if (rettv_list_alloc(rettv) == FAIL) -- { -- rettv->vval.v_number = 0; - return; -- } - - for (first = TRUE; ; first = FALSE) - if (get_tagfname(&tn, first, fname) == FAIL - || list_append_string(rettv->vval.v_list, fname, -1) == FAIL) - break; -@@ -16967,14 +17008,13 @@ f_taglist(argvars, rettv) - } - - /* - * "tempname()" function - */ --/*ARGSUSED*/ - static void - f_tempname(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - static int x = 'A'; - - rettv->v_type = VAR_STRING; -@@ -17003,15 +17043,14 @@ f_tempname(argvars, rettv) - } - - /* - * "test(list)" function: Just checking the walls... - */ --/*ARGSUSED*/ - static void - f_test(argvars, rettv) -- typval_T *argvars; -- typval_T *rettv; -+ typval_T *argvars UNUSED; -+ typval_T *rettv UNUSED; - { - /* Used for unit testing. Change the code below to your liking. */ - #if 0 - listitem_T *li; - list_T *l; -@@ -17292,15 +17331,14 @@ f_virtcol(argvars, rettv) - } - - /* - * "visualmode()" function - */ --/*ARGSUSED*/ - static void - f_visualmode(argvars, rettv) -- typval_T *argvars; -- typval_T *rettv; -+ typval_T *argvars UNUSED; -+ typval_T *rettv UNUSED; - { - #ifdef FEAT_VISUAL - char_u str[2]; - - rettv->v_type = VAR_STRING; -@@ -17309,12 +17347,10 @@ f_visualmode(argvars, rettv) - rettv->vval.v_string = vim_strsave(str); - - /* A non-zero number or non-empty string argument: reset mode. */ - if (non_zero_arg(&argvars[0])) - curbuf->b_visual_mode_eval = NUL; --#else -- rettv->vval.v_number = 0; /* return anything, it won't work anyway */ - #endif - } - - /* - * "winbufnr(nr)" function -@@ -17334,14 +17370,13 @@ f_winbufnr(argvars, rettv) - } - - /* - * "wincol()" function - */ --/*ARGSUSED*/ - static void - f_wincol(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - validate_cursor(); - rettv->vval.v_number = curwin->w_wcol + 1; - } -@@ -17364,27 +17399,25 @@ f_winheight(argvars, rettv) - } - - /* - * "winline()" function - */ --/*ARGSUSED*/ - static void - f_winline(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - validate_cursor(); - rettv->vval.v_number = curwin->w_wrow + 1; - } - - /* - * "winnr()" function - */ --/* ARGSUSED */ - static void - f_winnr(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - int nr = 1; - - #ifdef FEAT_WINDOWS -@@ -17394,14 +17427,13 @@ f_winnr(argvars, rettv) - } - - /* - * "winrestcmd()" function - */ --/* ARGSUSED */ - static void - f_winrestcmd(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - #ifdef FEAT_WINDOWS - win_T *wp; - int winnr = 1; -@@ -17429,15 +17461,14 @@ f_winrestcmd(argvars, rettv) - } - - /* - * "winrestview()" function - */ --/* ARGSUSED */ - static void - f_winrestview(argvars, rettv) - typval_T *argvars; -- typval_T *rettv; -+ typval_T *rettv UNUSED; - { - dict_T *dict; - - if (argvars[0].v_type != VAR_DICT - || (dict = argvars[0].vval.v_dict) == NULL) -@@ -17475,14 +17506,13 @@ f_winrestview(argvars, rettv) - } - - /* - * "winsaveview()" function - */ --/* ARGSUSED */ - static void - f_winsaveview(argvars, rettv) -- typval_T *argvars; -+ typval_T *argvars UNUSED; - typval_T *rettv; - { - dict_T *dict; - - dict = dict_alloc(); -@@ -18095,18 +18125,57 @@ get_vim_var_str(idx) - { - return get_tv_string(&vimvars[idx].vv_tv); - } - - /* -- * Set v:count, v:count1 and v:prevcount. -+ * Get List v: variable value. Caller must take care of reference count when -+ * needed. -+ */ -+ list_T * -+get_vim_var_list(idx) -+ int idx; -+{ -+ return vimvars[idx].vv_list; -+} -+ -+/* -+ * Set v:char to character "c". - */ - void --set_vcount(count, count1) -+set_vim_var_char(c) -+ int c; -+{ -+#ifdef FEAT_MBYTE -+ char_u buf[MB_MAXBYTES]; -+#else -+ char_u buf[2]; -+#endif -+ -+#ifdef FEAT_MBYTE -+ if (has_mbyte) -+ buf[(*mb_char2bytes)(c, buf)] = NUL; -+ else -+#endif -+ { -+ buf[0] = c; -+ buf[1] = NUL; -+ } -+ set_vim_var_string(VV_CHAR, buf, -1); -+} -+ -+/* -+ * Set v:count to "count" and v:count1 to "count1". -+ * When "set_prevcount" is TRUE first set v:prevcount from v:count. -+ */ -+ void -+set_vcount(count, count1, set_prevcount) - long count; - long count1; -+ int set_prevcount; - { -- vimvars[VV_PREVCOUNT].vv_nr = vimvars[VV_COUNT].vv_nr; -+ if (set_prevcount) -+ vimvars[VV_PREVCOUNT].vv_nr = vimvars[VV_COUNT].vv_nr; - vimvars[VV_COUNT].vv_nr = count; - vimvars[VV_COUNT1].vv_nr = count1; - } - - /* -@@ -18130,10 +18199,24 @@ set_vim_var_string(idx, val, len) - else - vimvars[idx].vv_str = vim_strnsave(val, len); - } - - /* -+ * Set List v: variable to "val". -+ */ -+ void -+set_vim_var_list(idx, val) -+ int idx; -+ list_T *val; -+{ -+ list_unref(vimvars[idx].vv_list); -+ vimvars[idx].vv_list = val; -+ if (val != NULL) -+ ++val->lv_refcount; -+} -+ -+/* - * Set v:register if needed. - */ - void - set_reg_var(c) - int c; -@@ -18866,11 +18949,12 @@ new_script_vars(id) - init_var_dict(dict, dict_var) - dict_T *dict; - dictitem_T *dict_var; - { - hash_init(&dict->dv_hashtab); -- dict->dv_refcount = 99999; -+ dict->dv_refcount = DO_NOT_FREE_CNT; -+ dict->dv_copyID = 0; - dict_var->di_tv.vval.v_dict = dict; - dict_var->di_tv.v_type = VAR_DICT; - dict_var->di_tv.v_lock = VAR_FIXED; - dict_var->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX; - dict_var->di_key[0] = NUL; -@@ -18949,11 +19033,12 @@ list_one_var(v, prefix, first) - { - char_u *tofree; - char_u *s; - char_u numbuf[NUMBUFLEN]; - -- s = echo_string(&v->di_tv, &tofree, numbuf, ++current_copyID); -+ current_copyID += COPYID_INC; -+ s = echo_string(&v->di_tv, &tofree, numbuf, current_copyID); - list_one_var_a(prefix, v->di_key, v->di_tv.v_type, - s == NULL ? (char_u *)"" : s, first); - vim_free(tofree); - } - -@@ -19016,35 +19101,38 @@ set_var(name, tv, copy) - dictitem_T *v; - char_u *varname; - hashtab_T *ht; - char_u *p; - -+ ht = find_var_ht(name, &varname); -+ if (ht == NULL || *varname == NUL) -+ { -+ EMSG2(_(e_illvar), name); -+ return; -+ } -+ v = find_var_in_ht(ht, varname, TRUE); -+ - if (tv->v_type == VAR_FUNC) - { - if (!(vim_strchr((char_u *)"wbs", name[0]) != NULL && name[1] == ':') - && !ASCII_ISUPPER((name[0] != NUL && name[1] == ':') - ? name[2] : name[0])) - { - EMSG2(_("E704: Funcref variable name must start with a capital: %s"), name); - return; - } -- if (function_exists(name)) -+ /* Don't allow hiding a function. When "v" is not NULL we migth be -+ * assigning another function to the same var, the type is checked -+ * below. */ -+ if (v == NULL && function_exists(name)) - { - EMSG2(_("E705: Variable name conflicts with existing function: %s"), - name); - return; - } - } - -- ht = find_var_ht(name, &varname); -- if (ht == NULL || *varname == NUL) -- { -- EMSG2(_(e_illvar), name); -- return; -- } -- -- v = find_var_in_ht(ht, varname, TRUE); - if (v != NULL) - { - /* existing variable, need to clear the value */ - if (var_check_ro(v->di_flags, name) - || tv_check_lock(v->di_tv.v_lock, name)) -@@ -19203,12 +19291,14 @@ tv_check_lock(lock, name) - - /* - * Copy the values from typval_T "from" to typval_T "to". - * When needed allocates string or increases reference count. - * Does not make a copy of a list or dict but copies the reference! -+ * It is OK for "from" and "to" to point to the same item. This is used to -+ * make a copy later. - */ -- static void -+ void - copy_tv(from, to) - typval_T *from; - typval_T *to; - { - to->v_type = from->v_type; -@@ -19382,11 +19472,12 @@ ex_echo(eap) - if (eap->cmdidx == CMD_echo) - msg_start(); - } - else if (eap->cmdidx == CMD_echo) - msg_puts_attr((char_u *)" ", echo_attr); -- p = echo_string(&rettv, &tofree, numbuf, ++current_copyID); -+ current_copyID += COPYID_INC; -+ p = echo_string(&rettv, &tofree, numbuf, current_copyID); - if (p != NULL) - for ( ; *p != NUL && !got_int; ++p) - { - if (*p == '\n' || *p == '\r' || *p == TAB) - { -@@ -19658,10 +19749,11 @@ ex_function(eap) - if (!isdigit(*fp->uf_name) - && vim_regexec(®match, fp->uf_name, 0)) - list_func_head(fp, FALSE); - } - } -+ vim_free(regmatch.regprog); - } - } - if (*p == '/') - ++p; - eap->nextcmd = check_nextcmd(p); -@@ -19746,11 +19838,11 @@ ex_function(eap) - msg_putchar('\n'); - msg_puts((char_u *)" endfunction"); - } - } - else -- emsg_funcname("E123: Undefined function: %s", name); -+ emsg_funcname(N_("E123: Undefined function: %s"), name); - } - goto ret_free; - } - - /* -@@ -19790,11 +19882,11 @@ ex_function(eap) - j = 0; - while (arg[j] != NUL && (j == 0 ? eval_isnamec1(arg[j]) - : eval_isnamec(arg[j]))) - ++j; - if (arg[j] != NUL) -- emsg_funcname(_(e_invarg2), arg); -+ emsg_funcname((char *)e_invarg2, arg); - } - } - - /* - * Isolate the arguments: "arg1, arg2, ...)" -@@ -20062,11 +20154,11 @@ ex_function(eap) - if (fudi.fd_dict == NULL) - { - v = find_var(name, &ht); - if (v != NULL && v->di_tv.v_type == VAR_FUNC) - { -- emsg_funcname("E707: Function name conflicts with variable: %s", -+ emsg_funcname(N_("E707: Function name conflicts with variable: %s"), - name); - goto erret; - } - - fp = find_func(name); -@@ -20077,11 +20169,11 @@ ex_function(eap) - emsg_funcname(e_funcexts, name); - goto erret; - } - if (fp->uf_calls > 0) - { -- emsg_funcname("E127: Cannot redefine function %s: It is in use", -+ emsg_funcname(N_("E127: Cannot redefine function %s: It is in use"), - name); - goto erret; - } - /* redefine existing function */ - ga_clear_strings(&(fp->uf_args)); -@@ -20588,10 +20680,13 @@ func_dump_profile(fd) - int i; - ufunc_T **sorttab; - int st_len = 0; - - todo = (int)func_hashtab.ht_used; -+ if (todo == 0) -+ return; /* nothing to dump */ -+ - sorttab = (ufunc_T **)alloc((unsigned)(sizeof(ufunc_T) * todo)); - - for (hi = func_hashtab.ht_array; todo > 0; ++hi) - { - if (!HASHITEM_EMPTY(hi)) -@@ -20636,10 +20731,12 @@ func_dump_profile(fd) - prof_sort_list(fd, sorttab, st_len, "TOTAL", FALSE); - qsort((void *)sorttab, (size_t)st_len, sizeof(ufunc_T *), - prof_self_cmp); - prof_sort_list(fd, sorttab, st_len, "SELF", TRUE); - } -+ -+ vim_free(sorttab); - } - - static void - prof_sort_list(fd, sorttab, st_len, title, prefer_self) - FILE *fd; -@@ -21010,11 +21107,11 @@ call_user_func(fp, argcount, argvars, re - dict_T *selfdict; /* Dictionary for "self" */ - { - char_u *save_sourcing_name; - linenr_T save_sourcing_lnum; - scid_T save_current_SID; -- funccall_T fc; -+ funccall_T *fc; - int save_did_emsg; - static int depth = 0; - dictitem_T *v; - int fixvar_idx = 0; /* index in fixvar[] */ - int i; -@@ -21036,40 +21133,41 @@ call_user_func(fp, argcount, argvars, re - } - ++depth; - - line_breakcheck(); /* check for CTRL-C hit */ - -- fc.caller = current_funccal; -- current_funccal = &fc; -- fc.func = fp; -- fc.rettv = rettv; -+ fc = (funccall_T *)alloc(sizeof(funccall_T)); -+ fc->caller = current_funccal; -+ current_funccal = fc; -+ fc->func = fp; -+ fc->rettv = rettv; - rettv->vval.v_number = 0; -- fc.linenr = 0; -- fc.returned = FALSE; -- fc.level = ex_nesting_level; -+ fc->linenr = 0; -+ fc->returned = FALSE; -+ fc->level = ex_nesting_level; - /* Check if this function has a breakpoint. */ -- fc.breakpoint = dbg_find_breakpoint(FALSE, fp->uf_name, (linenr_T)0); -- fc.dbg_tick = debug_tick; -+ fc->breakpoint = dbg_find_breakpoint(FALSE, fp->uf_name, (linenr_T)0); -+ fc->dbg_tick = debug_tick; - - /* -- * Note about using fc.fixvar[]: This is an array of FIXVAR_CNT variables -+ * Note about using fc->fixvar[]: This is an array of FIXVAR_CNT variables - * with names up to VAR_SHORT_LEN long. This avoids having to alloc/free - * each argument variable and saves a lot of time. - */ - /* - * Init l: variables. - */ -- init_var_dict(&fc.l_vars, &fc.l_vars_var); -+ init_var_dict(&fc->l_vars, &fc->l_vars_var); - if (selfdict != NULL) - { - /* Set l:self to "selfdict". Use "name" to avoid a warning from - * some compiler that checks the destination size. */ -- v = &fc.fixvar[fixvar_idx++].var; -+ v = &fc->fixvar[fixvar_idx++].var; - name = v->di_key; - STRCPY(name, "self"); - v->di_flags = DI_FLAGS_RO + DI_FLAGS_FIX; -- hash_add(&fc.l_vars.dv_hashtab, DI2HIKEY(v)); -+ hash_add(&fc->l_vars.dv_hashtab, DI2HIKEY(v)); - v->di_tv.v_type = VAR_DICT; - v->di_tv.v_lock = 0; - v->di_tv.vval.v_dict = selfdict; - ++selfdict->dv_refcount; - } -@@ -21077,32 +21175,35 @@ call_user_func(fp, argcount, argvars, re - /* - * Init a: variables. - * Set a:0 to "argcount". - * Set a:000 to a list with room for the "..." arguments. - */ -- init_var_dict(&fc.l_avars, &fc.l_avars_var); -- add_nr_var(&fc.l_avars, &fc.fixvar[fixvar_idx++].var, "0", -+ init_var_dict(&fc->l_avars, &fc->l_avars_var); -+ add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "0", - (varnumber_T)(argcount - fp->uf_args.ga_len)); -- v = &fc.fixvar[fixvar_idx++].var; -- STRCPY(v->di_key, "000"); -+ /* Use "name" to avoid a warning from some compiler that checks the -+ * destination size. */ -+ v = &fc->fixvar[fixvar_idx++].var; -+ name = v->di_key; -+ STRCPY(name, "000"); - v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX; -- hash_add(&fc.l_avars.dv_hashtab, DI2HIKEY(v)); -+ hash_add(&fc->l_avars.dv_hashtab, DI2HIKEY(v)); - v->di_tv.v_type = VAR_LIST; - v->di_tv.v_lock = VAR_FIXED; -- v->di_tv.vval.v_list = &fc.l_varlist; -- vim_memset(&fc.l_varlist, 0, sizeof(list_T)); -- fc.l_varlist.lv_refcount = 99999; -- fc.l_varlist.lv_lock = VAR_FIXED; -+ v->di_tv.vval.v_list = &fc->l_varlist; -+ vim_memset(&fc->l_varlist, 0, sizeof(list_T)); -+ fc->l_varlist.lv_refcount = DO_NOT_FREE_CNT; -+ fc->l_varlist.lv_lock = VAR_FIXED; - - /* - * Set a:firstline to "firstline" and a:lastline to "lastline". - * Set a:name to named arguments. - * Set a:N to the "..." arguments. - */ -- add_nr_var(&fc.l_avars, &fc.fixvar[fixvar_idx++].var, "firstline", -+ add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "firstline", - (varnumber_T)firstline); -- add_nr_var(&fc.l_avars, &fc.fixvar[fixvar_idx++].var, "lastline", -+ add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "lastline", - (varnumber_T)lastline); - for (i = 0; i < argcount; ++i) - { - ai = i - fp->uf_args.ga_len; - if (ai < 0) -@@ -21114,11 +21215,11 @@ call_user_func(fp, argcount, argvars, re - sprintf((char *)numbuf, "%d", ai + 1); - name = numbuf; - } - if (fixvar_idx < FIXVAR_CNT && STRLEN(name) <= VAR_SHORT_LEN) - { -- v = &fc.fixvar[fixvar_idx++].var; -+ v = &fc->fixvar[fixvar_idx++].var; - v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX; - } - else - { - v = (dictitem_T *)alloc((unsigned)(sizeof(dictitem_T) -@@ -21126,22 +21227,22 @@ call_user_func(fp, argcount, argvars, re - if (v == NULL) - break; - v->di_flags = DI_FLAGS_RO; - } - STRCPY(v->di_key, name); -- hash_add(&fc.l_avars.dv_hashtab, DI2HIKEY(v)); -+ hash_add(&fc->l_avars.dv_hashtab, DI2HIKEY(v)); - - /* Note: the values are copied directly to avoid alloc/free. - * "argvars" must have VAR_FIXED for v_lock. */ - v->di_tv = argvars[i]; - v->di_tv.v_lock = VAR_FIXED; - - if (ai >= 0 && ai < MAX_FUNC_ARGS) - { -- list_append(&fc.l_varlist, &fc.l_listitems[ai]); -- fc.l_listitems[ai].li_tv = argvars[i]; -- fc.l_listitems[ai].li_tv.v_lock = VAR_FIXED; -+ list_append(&fc->l_varlist, &fc->l_listitems[ai]); -+ fc->l_listitems[ai].li_tv = argvars[i]; -+ fc->l_listitems[ai].li_tv.v_lock = VAR_FIXED; - } - } - - /* Don't redraw while executing the function. */ - ++RedrawingDisabled; -@@ -21202,11 +21303,11 @@ call_user_func(fp, argcount, argvars, re - if (do_profiling == PROF_YES) - { - if (!fp->uf_profiling && has_profiling(FALSE, fp->uf_name, NULL)) - func_do_profile(fp); - if (fp->uf_profiling -- || (fc.caller != NULL && &fc.caller->func->uf_profiling)) -+ || (fc->caller != NULL && fc->caller->func->uf_profiling)) - { - ++fp->uf_tm_count; - profile_start(&call_start); - profile_zero(&fp->uf_tm_children); - } -@@ -21218,11 +21319,11 @@ call_user_func(fp, argcount, argvars, re - current_SID = fp->uf_script_ID; - save_did_emsg = did_emsg; - did_emsg = FALSE; - - /* call do_cmdline() to execute the lines */ -- do_cmdline(NULL, get_func_line, (void *)&fc, -+ do_cmdline(NULL, get_func_line, (void *)fc, - DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT); - - --RedrawingDisabled; - - /* when the function was aborted because of an error, return -1 */ -@@ -21233,20 +21334,20 @@ call_user_func(fp, argcount, argvars, re - rettv->vval.v_number = -1; - } - - #ifdef FEAT_PROFILE - if (do_profiling == PROF_YES && (fp->uf_profiling -- || (fc.caller != NULL && &fc.caller->func->uf_profiling))) -+ || (fc->caller != NULL && fc->caller->func->uf_profiling))) - { - profile_end(&call_start); - profile_sub_wait(&wait_start, &call_start); - profile_add(&fp->uf_tm_total, &call_start); - profile_self(&fp->uf_tm_self, &call_start, &fp->uf_tm_children); -- if (fc.caller != NULL && &fc.caller->func->uf_profiling) -+ if (fc->caller != NULL && fc->caller->func->uf_profiling) - { -- profile_add(&fc.caller->func->uf_tm_children, &call_start); -- profile_add(&fc.caller->func->uf_tml_children, &call_start); -+ profile_add(&fc->caller->func->uf_tm_children, &call_start); -+ profile_add(&fc->caller->func->uf_tml_children, &call_start); - } - } - #endif - - /* when being verbose, mention the return value */ -@@ -21255,24 +21356,24 @@ call_user_func(fp, argcount, argvars, re - ++no_wait_return; - verbose_enter_scroll(); - - if (aborting()) - smsg((char_u *)_("%s aborted"), sourcing_name); -- else if (fc.rettv->v_type == VAR_NUMBER) -+ else if (fc->rettv->v_type == VAR_NUMBER) - smsg((char_u *)_("%s returning #%ld"), sourcing_name, -- (long)fc.rettv->vval.v_number); -+ (long)fc->rettv->vval.v_number); - else - { - char_u buf[MSG_BUF_LEN]; - char_u numbuf2[NUMBUFLEN]; - char_u *tofree; - char_u *s; - - /* The value may be very long. Skip the middle part, so that we - * have some idea how it starts and ends. smsg() would always - * truncate it at the end. */ -- s = tv2string(fc.rettv, &tofree, numbuf2, 0); -+ s = tv2string(fc->rettv, &tofree, numbuf2, 0); - if (s != NULL) - { - trunc_string(s, buf, MSG_BUF_CLEN); - smsg((char_u *)_("%s returning %s"), sourcing_name, buf); - vim_free(tofree); -@@ -21304,18 +21405,88 @@ call_user_func(fp, argcount, argvars, re - verbose_leave_scroll(); - --no_wait_return; - } - - did_emsg |= save_did_emsg; -- current_funccal = fc.caller; -+ current_funccal = fc->caller; -+ --depth; - -- /* The a: variables typevals were not allocated, only free the allocated -- * variables. */ -- vars_clear_ext(&fc.l_avars.dv_hashtab, FALSE); -+ /* If the a:000 list and the l: and a: dicts are not referenced we can -+ * free the funccall_T and what's in it. */ -+ if (fc->l_varlist.lv_refcount == DO_NOT_FREE_CNT -+ && fc->l_vars.dv_refcount == DO_NOT_FREE_CNT -+ && fc->l_avars.dv_refcount == DO_NOT_FREE_CNT) -+ { -+ free_funccal(fc, FALSE); -+ } -+ else -+ { -+ hashitem_T *hi; -+ listitem_T *li; -+ int todo; - -- vars_clear(&fc.l_vars.dv_hashtab); /* free all l: variables */ -- --depth; -+ /* "fc" is still in use. This can happen when returning "a:000" or -+ * assigning "l:" to a global variable. -+ * Link "fc" in the list for garbage collection later. */ -+ fc->caller = previous_funccal; -+ previous_funccal = fc; -+ -+ /* Make a copy of the a: variables, since we didn't do that above. */ -+ todo = (int)fc->l_avars.dv_hashtab.ht_used; -+ for (hi = fc->l_avars.dv_hashtab.ht_array; todo > 0; ++hi) -+ { -+ if (!HASHITEM_EMPTY(hi)) -+ { -+ --todo; -+ v = HI2DI(hi); -+ copy_tv(&v->di_tv, &v->di_tv); -+ } -+ } -+ -+ /* Make a copy of the a:000 items, since we didn't do that above. */ -+ for (li = fc->l_varlist.lv_first; li != NULL; li = li->li_next) -+ copy_tv(&li->li_tv, &li->li_tv); -+ } -+} -+ -+/* -+ * Return TRUE if items in "fc" do not have "copyID". That means they are not -+ * referenced from anywhere that is in use. -+ */ -+ static int -+can_free_funccal(fc, copyID) -+ funccall_T *fc; -+ int copyID; -+{ -+ return (fc->l_varlist.lv_copyID != copyID -+ && fc->l_vars.dv_copyID != copyID -+ && fc->l_avars.dv_copyID != copyID); -+} -+ -+/* -+ * Free "fc" and what it contains. -+ */ -+ static void -+free_funccal(fc, free_val) -+ funccall_T *fc; -+ int free_val; /* a: vars were allocated */ -+{ -+ listitem_T *li; -+ -+ /* The a: variables typevals may not have been allocated, only free the -+ * allocated variables. */ -+ vars_clear_ext(&fc->l_avars.dv_hashtab, free_val); -+ -+ /* free all l: variables */ -+ vars_clear(&fc->l_vars.dv_hashtab); -+ -+ /* Free the a:000 variables if they were allocated. */ -+ if (free_val) -+ for (li = fc->l_varlist.lv_first; li != NULL; li = li->li_next) -+ clear_tv(&li->li_tv); -+ -+ vim_free(fc); - } - - /* - * Add a number variable "name" to dict "dp" with value "nr". - */ -@@ -21510,16 +21681,15 @@ get_return_cmd(rettv) - /* - * Get next function line. - * Called by do_cmdline() to get the next line. - * Returns allocated string, or NULL for end of function. - */ --/* ARGSUSED */ - char_u * - get_func_line(c, cookie, indent) -- int c; /* not used */ -+ int c UNUSED; - void *cookie; -- int indent; /* not used */ -+ int indent UNUSED; - { - funccall_T *fcp = (funccall_T *)cookie; - ufunc_T *fp = fcp->func; - char_u *retval; - garray_T *gap; /* growarray with function lines */ -@@ -21884,10 +22054,65 @@ last_set_msg(scriptID) - verbose_leave(); - } - } - } - -+/* -+ * List v:oldfiles in a nice way. -+ */ -+ void -+ex_oldfiles(eap) -+ exarg_T *eap UNUSED; -+{ -+ list_T *l = vimvars[VV_OLDFILES].vv_list; -+ listitem_T *li; -+ int nr = 0; -+ -+ if (l == NULL) -+ msg((char_u *)_("No old files")); -+ else -+ { -+ msg_start(); -+ msg_scroll = TRUE; -+ for (li = l->lv_first; li != NULL && !got_int; li = li->li_next) -+ { -+ msg_outnum((long)++nr); -+ MSG_PUTS(": "); -+ msg_outtrans(get_tv_string(&li->li_tv)); -+ msg_putchar('\n'); -+ out_flush(); /* output one line at a time */ -+ ui_breakcheck(); -+ } -+ /* Assume "got_int" was set to truncate the listing. */ -+ got_int = FALSE; -+ -+#ifdef FEAT_BROWSE_CMD -+ if (cmdmod.browse) -+ { -+ quit_more = FALSE; -+ nr = prompt_for_number(FALSE); -+ msg_starthere(); -+ if (nr > 0) -+ { -+ char_u *p = list_find_str(get_vim_var_list(VV_OLDFILES), -+ (long)nr); -+ -+ if (p != NULL) -+ { -+ p = expand_env_save(p); -+ eap->arg = p; -+ eap->cmdidx = CMD_edit; -+ cmdmod.browse = FALSE; -+ do_exedit(eap, NULL); -+ vim_free(p); -+ } -+ } -+ } -+#endif -+ } -+} -+ - #endif /* FEAT_EVAL */ - - - #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) || defined(PROTO) - ---- vim72.orig/src/ex_cmds.c -+++ vim72/src/ex_cmds.c -@@ -22,11 +22,11 @@ - static int linelen __ARGS((int *has_tab)); - #endif - static void do_filter __ARGS((linenr_T line1, linenr_T line2, exarg_T *eap, char_u *cmd, int do_in, int do_out)); - #ifdef FEAT_VIMINFO - static char_u *viminfo_filename __ARGS((char_u *)); --static void do_viminfo __ARGS((FILE *fp_in, FILE *fp_out, int want_info, int want_marks, int force_read)); -+static void do_viminfo __ARGS((FILE *fp_in, FILE *fp_out, int flags)); - static int viminfo_encoding __ARGS((vir_T *virp)); - static int read_viminfo_up_to_marks __ARGS((vir_T *virp, int forceit, int writing)); - #endif - - static int check_overwrite __ARGS((exarg_T *eap, buf_T *buf, char_u *fname, char_u *ffname, int other)); -@@ -41,16 +41,16 @@ static int - help_compare __ARGS((const void *s1, const void *s2)); - - /* - * ":ascii" and "ga". - */ --/*ARGSUSED*/ - void - do_ascii(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - int c; -+ int cval; - char buf1[20]; - char buf2[20]; - char_u buf3[7]; - #ifdef FEAT_MBYTE - int cc[MAX_MCO]; -@@ -73,30 +73,35 @@ do_ascii(eap) - if (!has_mbyte || (enc_dbcs != 0 && c < 0x100) || c < 0x80) - #endif - { - if (c == NL) /* NUL is stored as NL */ - c = NUL; -+ if (c == CAR && get_fileformat(curbuf) == EOL_MAC) -+ cval = NL; /* NL is stored as CR */ -+ else -+ cval = c; - if (vim_isprintc_strict(c) && (c < ' ' - #ifndef EBCDIC - || c > '~' - #endif - )) - { - transchar_nonprint(buf3, c); -- sprintf(buf1, " <%s>", (char *)buf3); -+ vim_snprintf(buf1, sizeof(buf1), " <%s>", (char *)buf3); - } - else - buf1[0] = NUL; - #ifndef EBCDIC - if (c >= 0x80) -- sprintf(buf2, " <M-%s>", transchar(c & 0x7f)); -+ vim_snprintf(buf2, sizeof(buf2), " <M-%s>", -+ (char *)transchar(c & 0x7f)); - else - #endif - buf2[0] = NUL; - vim_snprintf((char *)IObuff, IOSIZE, - _("<%s>%s%s %d, Hex %02x, Octal %03o"), -- transchar(c), buf1, buf2, c, c, c); -+ transchar(c), buf1, buf2, cval, cval, cval); - #ifdef FEAT_MBYTE - if (enc_utf8) - c = cc[ci++]; - else - c = 0; -@@ -351,11 +356,11 @@ ex_sort(eap) - regmatch_T regmatch; - int len; - linenr_T lnum; - long maxlen = 0; - sorti_T *nrs; -- size_t count = eap->line2 - eap->line1 + 1; -+ size_t count = (size_t)(eap->line2 - eap->line1 + 1); - size_t i; - char_u *p; - char_u *s; - char_u *s2; - char_u c; /* temporary character storage */ -@@ -950,11 +955,11 @@ do_bang(addr_count, eap, forceit, do_in, - vim_free(newcmd); - return; - } - len += (int)STRLEN(prevcmd); - } -- if ((t = alloc(len)) == NULL) -+ if ((t = alloc((unsigned)len)) == NULL) - { - vim_free(newcmd); - return; - } - *t = NUL; -@@ -1541,11 +1546,11 @@ make_filter_cmd(cmd, itmp, otmp) - /* - * Put braces around the command (for concatenated commands) when - * redirecting input and/or output. - */ - if (itmp != NULL || otmp != NULL) -- sprintf((char *)buf, "(%s)", (char *)cmd); -+ vim_snprintf((char *)buf, len, "(%s)", (char *)cmd); - else - STRCPY(buf, cmd); - if (itmp != NULL) - { - STRCAT(buf, " < "); -@@ -1590,41 +1595,45 @@ make_filter_cmd(cmd, itmp, otmp) - } - } - } - #endif - if (otmp != NULL) -- append_redir(buf, p_srr, otmp); -+ append_redir(buf, (int)len, p_srr, otmp); - - return buf; - } - - /* -- * Append output redirection for file "fname" to the end of string buffer "buf" -+ * Append output redirection for file "fname" to the end of string buffer -+ * "buf[buflen]" - * Works with the 'shellredir' and 'shellpipe' options. - * The caller should make sure that there is enough room: - * STRLEN(opt) + STRLEN(fname) + 3 - */ - void --append_redir(buf, opt, fname) -+append_redir(buf, buflen, opt, fname) - char_u *buf; -+ int buflen; - char_u *opt; - char_u *fname; - { - char_u *p; -+ char_u *end; - -- buf += STRLEN(buf); -+ end = buf + STRLEN(buf); - /* find "%s", skipping "%%" */ - for (p = opt; (p = vim_strchr(p, '%')) != NULL; ++p) - if (p[1] == 's') - break; - if (p != NULL) - { -- *buf = ' '; /* not really needed? Not with sh, ksh or bash */ -- sprintf((char *)buf + 1, (char *)opt, (char *)fname); -+ *end = ' '; /* not really needed? Not with sh, ksh or bash */ -+ vim_snprintf((char *)end + 1, (size_t)(buflen - (end + 1 - buf)), -+ (char *)opt, (char *)fname); - } - else -- sprintf((char *)buf, -+ vim_snprintf((char *)end, (size_t)(buflen - (end - buf)), - #ifdef FEAT_QUICKFIX - # ifndef RISCOS - opt != p_sp ? " %s%s" : - # endif - " %s %s", -@@ -1674,50 +1683,48 @@ viminfo_error(errnum, message, line) - return FALSE; - } - - /* - * read_viminfo() -- Read the viminfo file. Registers etc. which are already -- * set are not over-written unless force is TRUE. -- webb -+ * set are not over-written unless "flags" includes VIF_FORCEIT. -- webb - */ - int --read_viminfo(file, want_info, want_marks, forceit) -- char_u *file; -- int want_info; -- int want_marks; -- int forceit; -+read_viminfo(file, flags) -+ char_u *file; /* file name or NULL to use default name */ -+ int flags; /* VIF_WANT_INFO et al. */ - { - FILE *fp; - char_u *fname; - - if (no_viminfo()) - return FAIL; - -- fname = viminfo_filename(file); /* may set to default if NULL */ -+ fname = viminfo_filename(file); /* get file name in allocated buffer */ - if (fname == NULL) - return FAIL; - fp = mch_fopen((char *)fname, READBIN); - - if (p_verbose > 0) - { - verbose_enter(); - smsg((char_u *)_("Reading viminfo file \"%s\"%s%s%s"), - fname, -- want_info ? _(" info") : "", -- want_marks ? _(" marks") : "", -+ (flags & VIF_WANT_INFO) ? _(" info") : "", -+ (flags & VIF_WANT_MARKS) ? _(" marks") : "", -+ (flags & VIF_GET_OLDFILES) ? _(" oldfiles") : "", - fp == NULL ? _(" FAILED") : ""); - verbose_leave(); - } - - vim_free(fname); - if (fp == NULL) - return FAIL; - - viminfo_errcnt = 0; -- do_viminfo(fp, NULL, want_info, want_marks, forceit); -+ do_viminfo(fp, NULL, flags); - - fclose(fp); -- - return OK; - } - - /* - * write_viminfo() -- Write the viminfo file. The old one is read in first so -@@ -1784,11 +1791,11 @@ write_viminfo(file, forceit) - /* - * For Unix we check the owner of the file. It's not very nice to - * overwrite a user's viminfo file after a "su root", with a - * viminfo file that the user can't read. - */ -- st_old.st_dev = 0; -+ st_old.st_dev = (dev_t)0; - st_old.st_ino = 0; - st_old.st_mode = 0600; - if (mch_stat((char *)fname, &st_old) == 0 - && getuid() != ROOT_UID - && !(st_old.st_uid == getuid() -@@ -1941,11 +1948,11 @@ write_viminfo(file, forceit) - /* - * Make sure the owner can read/write it. This only works for - * root. - */ - if (fp_out != NULL) -- (void)fchown(fileno(fp_out), st_old.st_uid, st_old.st_gid); -+ ignored = fchown(fileno(fp_out), st_old.st_uid, st_old.st_gid); - #endif - } - } - - /* -@@ -1966,11 +1973,11 @@ write_viminfo(file, forceit) - smsg((char_u *)_("Writing viminfo file \"%s\""), fname); - verbose_leave(); - } - - viminfo_errcnt = 0; -- do_viminfo(fp_in, fp_out, !forceit, !forceit, FALSE); -+ do_viminfo(fp_in, fp_out, forceit ? 0 : (VIF_WANT_INFO | VIF_WANT_MARKS)); - - fclose(fp_out); /* errors are ignored !? */ - if (fp_in != NULL) - { - fclose(fp_in); -@@ -2039,16 +2046,14 @@ viminfo_filename(file) - - /* - * do_viminfo() -- Should only be called from read_viminfo() & write_viminfo(). - */ - static void --do_viminfo(fp_in, fp_out, want_info, want_marks, force_read) -+do_viminfo(fp_in, fp_out, flags) - FILE *fp_in; - FILE *fp_out; -- int want_info; -- int want_marks; -- int force_read; -+ int flags; - { - int count = 0; - int eof = FALSE; - vir_T vir; - -@@ -2059,12 +2064,13 @@ do_viminfo(fp_in, fp_out, want_info, wan - vir.vir_conv.vc_type = CONV_NONE; - #endif - - if (fp_in != NULL) - { -- if (want_info) -- eof = read_viminfo_up_to_marks(&vir, force_read, fp_out != NULL); -+ if (flags & VIF_WANT_INFO) -+ eof = read_viminfo_up_to_marks(&vir, -+ flags & VIF_FORCEIT, fp_out != NULL); - else - /* Skip info, find start of marks */ - while (!(eof = viminfo_readline(&vir)) - && vir.vir_line[0] != '>') - ; -@@ -2090,12 +2096,13 @@ do_viminfo(fp_in, fp_out, want_info, wan - #endif - write_viminfo_filemarks(fp_out); - write_viminfo_bufferlist(fp_out); - count = write_viminfo_marks(fp_out); - } -- if (fp_in != NULL && want_marks) -- copy_viminfo_marks(&vir, fp_out, count, eof); -+ if (fp_in != NULL -+ && (flags & (VIF_WANT_MARKS | VIF_GET_OLDFILES | VIF_FORCEIT))) -+ copy_viminfo_marks(&vir, fp_out, count, eof, flags); - - vim_free(vir.vir_line); - #ifdef FEAT_MBYTE - if (vir.vir_conv.vc_type != CONV_NONE) - convert_setup(&vir.vir_conv, NULL, NULL); -@@ -2246,16 +2253,15 @@ viminfo_readline(virp) - * - * Check for a long line as written by viminfo_writestring(). - * - * Return the string in allocated memory (NULL when out of memory). - */ --/*ARGSUSED*/ - char_u * - viminfo_readstring(virp, off, convert) - vir_T *virp; - int off; /* offset for virp->vir_line */ -- int convert; /* convert the string */ -+ int convert UNUSED; /* convert the string */ - { - char_u *retval; - char_u *s, *d; - long len; - -@@ -2363,14 +2369,13 @@ viminfo_writestring(fd, p) - * Implementation of ":fixdel", also used by get_stty(). - * <BS> resulting <Del> - * ^? ^H - * not ^? ^? - */ --/*ARGSUSED*/ - void - do_fixdel(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - char_u *p; - - p = find_termcode((char_u *)"kb"); - add_termcode((char_u *)"kD", p != NULL -@@ -2385,11 +2390,12 @@ print_line_no_prefix(lnum, use_number, l - { - char_u numbuf[30]; - - if (curwin->w_p_nu || use_number) - { -- sprintf((char *)numbuf, "%*ld ", number_width(curwin), (long)lnum); -+ vim_snprintf((char *)numbuf, sizeof(numbuf), -+ "%*ld ", number_width(curwin), (long)lnum); - msg_puts_attr(numbuf, hl_attr(HLF_N)); /* Highlight line nrs */ - } - msg_prt_line(ml_get(lnum), list); - } - -@@ -2412,12 +2418,12 @@ print_line(lnum, use_number, list) - { - msg_putchar('\n'); - cursor_on(); /* msg_start() switches it off */ - out_flush(); - silent_mode = save_silent; -- info_message = FALSE; - } -+ info_message = FALSE; - } - - /* - * ":file[!] [fname]". - */ -@@ -2702,11 +2708,16 @@ do_write(eap) - - /* After ":saveas fname" reset 'readonly'. */ - if (eap->cmdidx == CMD_saveas) - { - if (retval == OK) -+ { - curbuf->b_p_ro = FALSE; -+#ifdef FEAT_WINDOWS -+ redraw_tabline = TRUE; -+#endif -+ } - /* Change directories when the 'acd' option is set. */ - DO_AUTOCHDIR - } - } - -@@ -2722,11 +2733,10 @@ theend: - * Check if it is allowed to overwrite a file. If b_flags has BF_NOTEDITED, - * BF_NEW or BF_READERR, check for overwriting current file. - * May set eap->forceit if a dialog says it's OK to overwrite. - * Return OK if it's OK, FAIL if it is not. - */ --/*ARGSUSED*/ - static int - check_overwrite(eap, buf, fname, ffname, other) - exarg_T *eap; - buf_T *buf; - char_u *fname; /* file name to be used (can differ from -@@ -3052,11 +3062,12 @@ getfile(fnum, ffname, sfname, setpm, lnu - check_cursor_lnum(); - beginline(BL_SOL | BL_FIX); - retval = 0; /* it's in the same file */ - } - else if (do_ecmd(fnum, ffname, sfname, NULL, lnum, -- (P_HID(curbuf) ? ECMD_HIDE : 0) + (forceit ? ECMD_FORCEIT : 0)) == OK) -+ (P_HID(curbuf) ? ECMD_HIDE : 0) + (forceit ? ECMD_FORCEIT : 0), -+ curwin) == OK) - retval = -1; /* opened another file */ - else - retval = 1; /* error encountered */ - - theend: -@@ -3085,21 +3096,25 @@ theend: - * ECMD_HIDE: if TRUE don't free the current buffer - * ECMD_SET_HELP: set b_help flag of (new) buffer before opening file - * ECMD_OLDBUF: use existing buffer if it exists - * ECMD_FORCEIT: ! used for Ex command - * ECMD_ADDBUF: don't edit, just add to buffer list -+ * oldwin: Should be "curwin" when editing a new buffer in the current -+ * window, NULL when splitting the window first. When not NULL info -+ * of the previous buffer for "oldwin" is stored. - * - * return FAIL for failure, OK otherwise - */ - int --do_ecmd(fnum, ffname, sfname, eap, newlnum, flags) -+do_ecmd(fnum, ffname, sfname, eap, newlnum, flags, oldwin) - int fnum; - char_u *ffname; - char_u *sfname; - exarg_T *eap; /* can be NULL! */ - linenr_T newlnum; - int flags; -+ win_T *oldwin; - { - int other_file; /* TRUE if editing another file */ - int oldbuf; /* TRUE if using existing buffer */ - #ifdef FEAT_AUTOCMD - int auto_buf = FALSE; /* TRUE if autocommands brought us -@@ -3267,11 +3282,12 @@ do_ecmd(fnum, ffname, sfname, eap, newln - if (!(flags & ECMD_ADDBUF)) - #endif - { - if (!cmdmod.keepalt) - curwin->w_alt_fnum = curbuf->b_fnum; -- buflist_altfpos(); -+ if (oldwin != NULL) -+ buflist_altfpos(oldwin); - } - - if (fnum) - buf = buflist_findnr(fnum); - else -@@ -3371,11 +3387,11 @@ do_ecmd(fnum, ffname, sfname, eap, newln - #endif - buf_copy_options(buf, BCO_ENTER); - - /* close the link to the current buffer */ - u_sync(FALSE); -- close_buffer(curwin, curbuf, -+ close_buffer(oldwin, curbuf, - (flags & ECMD_HIDE) ? 0 : DOBUF_UNLOAD); - - #ifdef FEAT_AUTOCMD - # ifdef FEAT_EVAL - if (aborting()) /* autocmds may abort script processing */ -@@ -3699,11 +3715,11 @@ do_ecmd(fnum, ffname, sfname, eap, newln - - #ifdef FEAT_SPELL - /* If the window options were changed may need to set the spell language. - * Can only do this after the buffer has been properly setup. */ - if (did_get_winopts && curwin->w_p_spell && *curbuf->b_p_spl != NUL) -- did_set_spelllang(curbuf); -+ (void)did_set_spelllang(curbuf); - #endif - - if (command == NULL) - { - if (newcol >= 0) /* position set by autocommands */ -@@ -3772,11 +3788,11 @@ do_ecmd(fnum, ffname, sfname, eap, newln - if (command != NULL) - do_cmdline(command, NULL, NULL, DOCMD_VERBOSE); - - #ifdef FEAT_KEYMAP - if (curbuf->b_kmap_state & KEYMAP_INIT) -- keymap_init(); -+ (void)keymap_init(); - #endif - - --RedrawingDisabled; - if (!skip_redraw) - { -@@ -3995,10 +4011,13 @@ ex_change(eap) - { - if (curbuf->b_ml.ml_flags & ML_EMPTY) /* nothing to delete */ - break; - ml_delete(eap->line1, FALSE); - } -+ -+ /* make sure the cursor is not beyond the end of the file now */ -+ check_cursor_lnum(); - deleted_lines_mark(eap->line1, (long)(eap->line2 - lnum)); - - /* ":append" on the line above the deleted lines. */ - eap->line2 = eap->line1; - ex_append(eap); -@@ -4020,12 +4039,14 @@ ex_z(eap) - * 'scroll' */ - if (eap->forceit) - bigness = curwin->w_height; - else if (firstwin == lastwin) - bigness = curwin->w_p_scr * 2; -+#ifdef FEAT_WINDOWS - else - bigness = curwin->w_height - 3; -+#endif - if (bigness < 1) - bigness = 1; - - x = eap->arg; - kind = x; -@@ -4215,17 +4236,19 @@ do_sub(eap) - linenr_T line2; - long nmatch; /* number of lines in match */ - char_u *sub_firstline; /* allocated copy of first sub line */ - int endcolumn = FALSE; /* cursor in last column when done */ - pos_T old_cursor = curwin->w_cursor; -+ int start_nsubs; - - cmd = eap->arg; - if (!global_busy) - { - sub_nsubs = 0; - sub_nlines = 0; - } -+ start_nsubs = sub_nsubs; - - if (eap->cmdidx == CMD_tilde) - which_pat = RE_LAST; /* use last used regexp */ - else - which_pat = RE_SUBST; /* use last substitute regexp */ -@@ -4470,11 +4493,11 @@ do_sub(eap) - char_u *new_end, *new_start = NULL; - unsigned new_start_len = 0; - char_u *p1; - int did_sub = FALSE; - int lastone; -- unsigned len, needed_len; -+ int len, copy_len, needed_len; - long nmatch_tl = 0; /* nr of lines matched below lnum */ - int do_again; /* do it again after joining lines */ - int skip_match = FALSE; - linenr_T sub_firstlnum; /* nr of first sub line */ - -@@ -4615,10 +4638,12 @@ do_sub(eap) - goto skip; - } - - if (do_ask) - { -+ int typed = 0; -+ - /* change State to CONFIRM, so that the mouse works - * properly */ - save_State = State; - State = CONFIRM; - #ifdef FEAT_MOUSE -@@ -4653,11 +4678,11 @@ do_sub(eap) - msg_putchar('^'); - - resp = getexmodeline('?', NULL, 0); - if (resp != NULL) - { -- i = *resp; -+ typed = *resp; - vim_free(resp); - } - } - else - { -@@ -4705,61 +4730,61 @@ do_sub(eap) - #ifdef USE_ON_FLY_SCROLL - dont_scroll = FALSE; /* allow scrolling here */ - #endif - ++no_mapping; /* don't map this key */ - ++allow_keys; /* allow special keys */ -- i = plain_vgetc(); -+ typed = plain_vgetc(); - --allow_keys; - --no_mapping; - - /* clear the question */ - msg_didout = FALSE; /* don't scroll up */ - msg_col = 0; - gotocmdline(TRUE); - } - - need_wait_return = FALSE; /* no hit-return prompt */ -- if (i == 'q' || i == ESC || i == Ctrl_C -+ if (typed == 'q' || typed == ESC || typed == Ctrl_C - #ifdef UNIX -- || i == intr_char -+ || typed == intr_char - #endif - ) - { - got_quit = TRUE; - break; - } -- if (i == 'n') -+ if (typed == 'n') - break; -- if (i == 'y') -+ if (typed == 'y') - break; -- if (i == 'l') -+ if (typed == 'l') - { - /* last: replace and then stop */ - do_all = FALSE; - line2 = lnum; - break; - } -- if (i == 'a') -+ if (typed == 'a') - { - do_ask = FALSE; - break; - } - #ifdef FEAT_INS_EXPAND -- if (i == Ctrl_E) -+ if (typed == Ctrl_E) - scrollup_clamp(); -- else if (i == Ctrl_Y) -+ else if (typed == Ctrl_Y) - scrolldown_clamp(); - #endif - } - State = save_State; - #ifdef FEAT_MOUSE - setmouse(); - #endif - if (vim_strchr(p_cpo, CPO_UNDO) != NULL) - --no_u_sync; - -- if (i == 'n') -+ if (typed == 'n') - { - /* For a multi-line match, put matchcol at the NUL at - * the end of the line and set nmatch to one, so that - * we continue looking for a match on the next line. - * Avoids that ":%s/\nB\@=//gc" and ":%s/\n/,\r/gc" -@@ -4806,13 +4831,13 @@ do_sub(eap) - else - { - p1 = ml_get(sub_firstlnum + nmatch - 1); - nmatch_tl += nmatch - 1; - } -- i = regmatch.startpos[0].col - copycol; -- needed_len = i + ((unsigned)STRLEN(p1) - regmatch.endpos[0].col) -- + sublen + 1; -+ copy_len = regmatch.startpos[0].col - copycol; -+ needed_len = copy_len + ((unsigned)STRLEN(p1) -+ - regmatch.endpos[0].col) + sublen + 1; - if (new_start == NULL) - { - /* - * Get some space for a temporary buffer to do the - * substitution into (and some extra space to avoid -@@ -4831,11 +4856,11 @@ do_sub(eap) - * substitution into. If not, make it larger (with a bit - * extra to avoid too many calls to alloc()/free()). - */ - len = (unsigned)STRLEN(new_start); - needed_len += len; -- if (needed_len > new_start_len) -+ if (needed_len > (int)new_start_len) - { - new_start_len = needed_len + 50; - if ((p1 = alloc_check(new_start_len)) == NULL) - { - vim_free(new_start); -@@ -4849,12 +4874,12 @@ do_sub(eap) - } - - /* - * copy the text up to the part that matched - */ -- mch_memmove(new_end, sub_firstline + copycol, (size_t)i); -- new_end += i; -+ mch_memmove(new_end, sub_firstline + copycol, (size_t)copy_len); -+ new_end += copy_len; - - (void)vim_regsub_multi(®match, - sub_firstlnum - regmatch.startpos[0].lnum, - sub, new_end, TRUE, p_magic, TRUE); - sub_nsubs++; -@@ -5057,10 +5082,11 @@ skip: - line_breakcheck(); - } - - if (did_sub) - ++sub_nlines; -+ vim_free(new_start); /* for when substitute was cancelled */ - vim_free(sub_firstline); /* free the copy of the original line */ - sub_firstline = NULL; - } - - line_breakcheck(); -@@ -5080,11 +5106,11 @@ outofmem: - - /* ":s/pat//n" doesn't move the cursor */ - if (do_count) - curwin->w_cursor = old_cursor; - -- if (sub_nsubs) -+ if (sub_nsubs > start_nsubs) - { - /* Set the '[ and '] marks. */ - curbuf->b_op_start.lnum = eap->line1; - curbuf->b_op_end.lnum = line2; - curbuf->b_op_start.col = curbuf->b_op_end.col = 0; -@@ -5210,12 +5236,10 @@ ex_global(eap) - type = 'v'; - else - type = *eap->cmd; - cmd = eap->arg; - which_pat = RE_LAST; /* default: use last used regexp */ -- sub_nsubs = 0; -- sub_nlines = 0; - - /* - * undocumented vi feature: - * "\/" and "\?": use previous search pattern. - * "\&": use previous substitute pattern. -@@ -5315,10 +5339,12 @@ global_exe(cmd) - setpcmark(); - - /* When the command writes a message, don't overwrite the command. */ - msg_didout = TRUE; - -+ sub_nsubs = 0; -+ sub_nlines = 0; - global_need_beginline = FALSE; - global_busy = 1; - old_lcount = curbuf->b_ml.ml_line_count; - while (!got_int && (lnum = ml_firstmarked()) != 0 && global_busy == 1) - { -@@ -5608,11 +5634,17 @@ ex_help(eap) - * set b_p_ro flag). - * Set the alternate file to the previously edited file. - */ - alt_fnum = curbuf->b_fnum; - (void)do_ecmd(0, NULL, NULL, NULL, ECMD_LASTL, -- ECMD_HIDE + ECMD_SET_HELP); -+ ECMD_HIDE + ECMD_SET_HELP, -+#ifdef FEAT_WINDOWS -+ NULL /* buffer is still open, don't store info */ -+#else -+ curwin -+#endif -+ ); - if (!cmdmod.keepalt) - curwin->w_alt_fnum = alt_fnum; - empty_fnum = curbuf->b_fnum; - } - } -@@ -5767,11 +5799,11 @@ find_help_tags(arg, num_matches, matches - - /* - * Recognize a few exceptions to the rule. Some strings that contain '*' - * with "star". Otherwise '*' is recognized as a wildcard. - */ -- for (i = sizeof(mtable) / sizeof(char *); --i >= 0; ) -+ for (i = (int)(sizeof(mtable) / sizeof(char *)); --i >= 0; ) - if (STRCMP(arg, mtable[i]) == 0) - { - STRCPY(d, rtable[i]); - break; - } -@@ -6091,25 +6123,23 @@ fix_help_buffer() - } - - /* - * ":exusage" - */ --/*ARGSUSED*/ - void - ex_exusage(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - do_cmdline_cmd((char_u *)"help ex-cmd-index"); - } - - /* - * ":viusage" - */ --/*ARGSUSED*/ - void - ex_viusage(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - do_cmdline_cmd((char_u *)"help normal-index"); - } - - #if defined(FEAT_EX_EXTRA) || defined(PROTO) -@@ -6517,26 +6547,15 @@ struct sign - }; - - static sign_T *first_sign = NULL; - static int last_sign_typenr = MAX_TYPENR; /* is decremented */ - -+static int sign_cmd_idx __ARGS((char_u *begin_cmd, char_u *end_cmd)); - static void sign_list_defined __ARGS((sign_T *sp)); -+static void sign_undefine __ARGS((sign_T *sp, sign_T *sp_prev)); - --/* -- * ":sign" command -- */ -- void --ex_sign(eap) -- exarg_T *eap; --{ -- char_u *arg = eap->arg; -- char_u *p; -- int idx; -- sign_T *sp; -- sign_T *sp_prev; -- buf_T *buf; -- static char *cmds[] = { -+static char *cmds[] = { - "define", - #define SIGNCMD_DEFINE 0 - "undefine", - #define SIGNCMD_UNDEFINE 1 - "list", -@@ -6545,26 +6564,55 @@ ex_sign(eap) - #define SIGNCMD_PLACE 3 - "unplace", - #define SIGNCMD_UNPLACE 4 - "jump", - #define SIGNCMD_JUMP 5 -+ NULL - #define SIGNCMD_LAST 6 -- }; -+}; -+ -+/* -+ * Find index of a ":sign" subcmd from its name. -+ * "*end_cmd" must be writable. -+ */ -+ static int -+sign_cmd_idx(begin_cmd, end_cmd) -+ char_u *begin_cmd; /* begin of sign subcmd */ -+ char_u *end_cmd; /* just after sign subcmd */ -+{ -+ int idx; -+ char save = *end_cmd; -+ -+ *end_cmd = NUL; -+ for (idx = 0; ; ++idx) -+ if (cmds[idx] == NULL || STRCMP(begin_cmd, cmds[idx]) == 0) -+ break; -+ *end_cmd = save; -+ return idx; -+} -+ -+/* -+ * ":sign" command -+ */ -+ void -+ex_sign(eap) -+ exarg_T *eap; -+{ -+ char_u *arg = eap->arg; -+ char_u *p; -+ int idx; -+ sign_T *sp; -+ sign_T *sp_prev; -+ buf_T *buf; - - /* Parse the subcommand. */ - p = skiptowhite(arg); -- if (*p != NUL) -- *p++ = NUL; -- for (idx = 0; ; ++idx) -+ idx = sign_cmd_idx(arg, p); -+ if (idx == SIGNCMD_LAST) - { -- if (idx == SIGNCMD_LAST) -- { -- EMSG2(_("E160: Unknown sign command: %s"), arg); -- return; -- } -- if (STRCMP(arg, cmds[idx]) == 0) -- break; -+ EMSG2(_("E160: Unknown sign command: %s"), arg); -+ return; - } - arg = skipwhite(p); - - if (idx <= SIGNCMD_LIST) - { -@@ -6726,28 +6774,12 @@ ex_sign(eap) - EMSG2(_("E155: Unknown sign: %s"), arg); - else if (idx == SIGNCMD_LIST) - /* ":sign list {name}" */ - sign_list_defined(sp); - else -- { - /* ":sign undefine {name}" */ -- vim_free(sp->sn_name); -- vim_free(sp->sn_icon); --#ifdef FEAT_SIGN_ICONS -- if (sp->sn_image != NULL) -- { -- out_flush(); -- gui_mch_destroy_sign(sp->sn_image); -- } --#endif -- vim_free(sp->sn_text); -- if (sp_prev == NULL) -- first_sign = sp->sn_next; -- else -- sp_prev->sn_next = sp->sn_next; -- vim_free(sp); -- } -+ sign_undefine(sp, sp_prev); - } - } - else - { - int id = -1; -@@ -6992,10 +7024,35 @@ sign_list_defined(sp) - msg_puts(p); - } - } - - /* -+ * Undefine a sign and free its memory. -+ */ -+ static void -+sign_undefine(sp, sp_prev) -+ sign_T *sp; -+ sign_T *sp_prev; -+{ -+ vim_free(sp->sn_name); -+ vim_free(sp->sn_icon); -+#ifdef FEAT_SIGN_ICONS -+ if (sp->sn_image != NULL) -+ { -+ out_flush(); -+ gui_mch_destroy_sign(sp->sn_image); -+ } -+#endif -+ vim_free(sp->sn_text); -+ if (sp_prev == NULL) -+ first_sign = sp->sn_next; -+ else -+ sp_prev->sn_next = sp->sn_next; -+ vim_free(sp); -+} -+ -+/* - * Get highlighting attribute for sign "typenr". - * If "line" is TRUE: line highl, if FALSE: text highl. - */ - int - sign_get_attr(typenr, line) -@@ -7065,10 +7122,201 @@ sign_typenr2name(typenr) - if (sp->sn_typenr == typenr) - return sp->sn_name; - return (char_u *)_("[Deleted]"); - } - -+#if defined(EXITFREE) || defined(PROTO) -+/* -+ * Undefine/free all signs. -+ */ -+ void -+free_signs() -+{ -+ while (first_sign != NULL) -+ sign_undefine(first_sign, NULL); -+} -+#endif -+ -+#if defined(FEAT_CMDL_COMPL) || defined(PROTO) -+static enum -+{ -+ EXP_SUBCMD, /* expand :sign sub-commands */ -+ EXP_DEFINE, /* expand :sign define {name} args */ -+ EXP_PLACE, /* expand :sign place {id} args */ -+ EXP_UNPLACE, /* expand :sign unplace" */ -+ EXP_SIGN_NAMES /* expand with name of placed signs */ -+} expand_what; -+ -+/* -+ * Function given to ExpandGeneric() to obtain the sign command -+ * expansion. -+ */ -+ char_u * -+get_sign_name(xp, idx) -+ expand_T *xp UNUSED; -+ int idx; -+{ -+ sign_T *sp; -+ int current_idx; -+ -+ switch (expand_what) -+ { -+ case EXP_SUBCMD: -+ return (char_u *)cmds[idx]; -+ case EXP_DEFINE: -+ { -+ char *define_arg[] = -+ { -+ "icon=", "linehl=", "text=", "texthl=", NULL -+ }; -+ return (char_u *)define_arg[idx]; -+ } -+ case EXP_PLACE: -+ { -+ char *place_arg[] = -+ { -+ "line=", "name=", "file=", "buffer=", NULL -+ }; -+ return (char_u *)place_arg[idx]; -+ } -+ case EXP_UNPLACE: -+ { -+ char *unplace_arg[] = { "file=", "buffer=", NULL }; -+ return (char_u *)unplace_arg[idx]; -+ } -+ case EXP_SIGN_NAMES: -+ /* Complete with name of signs already defined */ -+ current_idx = 0; -+ for (sp = first_sign; sp != NULL; sp = sp->sn_next) -+ if (current_idx++ == idx) -+ return sp->sn_name; -+ return NULL; -+ default: -+ return NULL; -+ } -+} -+ -+/* -+ * Handle command line completion for :sign command. -+ */ -+ void -+set_context_in_sign_cmd(xp, arg) -+ expand_T *xp; -+ char_u *arg; -+{ -+ char_u *p; -+ char_u *end_subcmd; -+ char_u *last; -+ int cmd_idx; -+ char_u *begin_subcmd_args; -+ -+ /* Default: expand subcommands. */ -+ xp->xp_context = EXPAND_SIGN; -+ expand_what = EXP_SUBCMD; -+ xp->xp_pattern = arg; -+ -+ end_subcmd = skiptowhite(arg); -+ if (*end_subcmd == NUL) -+ /* expand subcmd name -+ * :sign {subcmd}<CTRL-D>*/ -+ return; -+ -+ cmd_idx = sign_cmd_idx(arg, end_subcmd); -+ -+ /* :sign {subcmd} {subcmd_args} -+ * | -+ * begin_subcmd_args */ -+ begin_subcmd_args = skipwhite(end_subcmd); -+ p = skiptowhite(begin_subcmd_args); -+ if (*p == NUL) -+ { -+ /* -+ * Expand first argument of subcmd when possible. -+ * For ":jump {id}" and ":unplace {id}", we could -+ * possibly expand the ids of all signs already placed. -+ */ -+ xp->xp_pattern = begin_subcmd_args; -+ switch (cmd_idx) -+ { -+ case SIGNCMD_LIST: -+ case SIGNCMD_UNDEFINE: -+ /* :sign list <CTRL-D> -+ * :sign undefine <CTRL-D> */ -+ expand_what = EXP_SIGN_NAMES; -+ break; -+ default: -+ xp->xp_context = EXPAND_NOTHING; -+ } -+ return; -+ } -+ -+ /* expand last argument of subcmd */ -+ -+ /* :sign define {name} {args}... -+ * | -+ * p */ -+ -+ /* Loop until reaching last argument. */ -+ do -+ { -+ p = skipwhite(p); -+ last = p; -+ p = skiptowhite(p); -+ } while (*p != NUL); -+ -+ p = vim_strchr(last, '='); -+ -+ /* :sign define {name} {args}... {last}= -+ * | | -+ * last p */ -+ if (p == NUL) -+ { -+ /* Expand last argument name (before equal sign). */ -+ xp->xp_pattern = last; -+ switch (cmd_idx) -+ { -+ case SIGNCMD_DEFINE: -+ expand_what = EXP_DEFINE; -+ break; -+ case SIGNCMD_PLACE: -+ expand_what = EXP_PLACE; -+ break; -+ case SIGNCMD_JUMP: -+ case SIGNCMD_UNPLACE: -+ expand_what = EXP_UNPLACE; -+ break; -+ default: -+ xp->xp_context = EXPAND_NOTHING; -+ } -+ } -+ else -+ { -+ /* Expand last argument value (after equal sign). */ -+ xp->xp_pattern = p + 1; -+ switch (cmd_idx) -+ { -+ case SIGNCMD_DEFINE: -+ if (STRNCMP(last, "texthl", p - last) == 0 || -+ STRNCMP(last, "linehl", p - last) == 0) -+ xp->xp_context = EXPAND_HIGHLIGHT; -+ else if (STRNCMP(last, "icon", p - last) == 0) -+ xp->xp_context = EXPAND_FILES; -+ else -+ xp->xp_context = EXPAND_NOTHING; -+ break; -+ case SIGNCMD_PLACE: -+ if (STRNCMP(last, "name", p - last) == 0) -+ expand_what = EXP_SIGN_NAMES; -+ else -+ xp->xp_context = EXPAND_NOTHING; -+ break; -+ default: -+ xp->xp_context = EXPAND_NOTHING; -+ } -+ } -+} -+#endif - #endif - - #if defined(FEAT_GUI) || defined(FEAT_CLIENTSERVER) || defined(PROTO) - /* - * ":drop" ---- vim72.orig/src/ex_cmds.h -+++ vim72/src/ex_cmds.h -@@ -276,11 +276,11 @@ EX(CMD_cpfile, "cpfile", ex_cnext, - EX(CMD_cquit, "cquit", ex_cquit, - TRLBAR|BANG), - EX(CMD_crewind, "crewind", ex_cc, - RANGE|NOTADR|COUNT|TRLBAR|BANG), - EX(CMD_cscope, "cscope", do_cscope, -- EXTRA|NOTRLCOM|SBOXOK|XFILE), -+ EXTRA|NOTRLCOM|XFILE), - EX(CMD_cstag, "cstag", do_cstag, - BANG|TRLBAR|WORD1), - EX(CMD_cunmap, "cunmap", ex_unmap, - EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), - EX(CMD_cunabbrev, "cunabbrev", ex_abbreviate, -@@ -504,11 +504,11 @@ EX(CMD_lcd, "lcd", ex_cd, - EX(CMD_lchdir, "lchdir", ex_cd, - BANG|FILE1|TRLBAR|CMDWIN), - EX(CMD_lclose, "lclose", ex_cclose, - RANGE|NOTADR|COUNT|TRLBAR), - EX(CMD_lcscope, "lcscope", do_cscope, -- EXTRA|NOTRLCOM|SBOXOK|XFILE), -+ EXTRA|NOTRLCOM|XFILE), - EX(CMD_left, "left", ex_align, - TRLBAR|RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY), - EX(CMD_leftabove, "leftabove", ex_wrongmodifier, - NEEDARG|EXTRA|NOTRLCOM), - EX(CMD_let, "let", ex_let, -@@ -633,10 +633,12 @@ EX(CMD_nnoremap, "nnoremap", ex_map, - EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), - EX(CMD_nnoremenu, "nnoremenu", ex_menu, - RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), - EX(CMD_noremap, "noremap", ex_map, - BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), -+EX(CMD_noautocmd, "noautocmd", ex_wrongmodifier, -+ NEEDARG|EXTRA|NOTRLCOM), - EX(CMD_nohlsearch, "nohlsearch", ex_nohlsearch, - TRLBAR|SBOXOK|CMDWIN), - EX(CMD_noreabbrev, "noreabbrev", ex_abbreviate, - EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), - EX(CMD_noremenu, "noremenu", ex_menu, -@@ -649,10 +651,12 @@ EX(CMD_nunmap, "nunmap", ex_unmap, - EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), - EX(CMD_nunmenu, "nunmenu", ex_menu, - EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), - EX(CMD_open, "open", ex_open, - RANGE|EXTRA), -+EX(CMD_oldfiles, "oldfiles", ex_oldfiles, -+ BANG|TRLBAR|SBOXOK|CMDWIN), - EX(CMD_omap, "omap", ex_map, - EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), - EX(CMD_omapclear, "omapclear", ex_mapclear, - EXTRA|TRLBAR|CMDWIN), - EX(CMD_omenu, "omenu", ex_menu, -@@ -800,11 +804,11 @@ EX(CMD_sbrewind, "sbrewind", ex_brewind, - EX(CMD_scriptnames, "scriptnames", ex_scriptnames, - TRLBAR|CMDWIN), - EX(CMD_scriptencoding, "scriptencoding", ex_scriptencoding, - WORD1|TRLBAR|CMDWIN), - EX(CMD_scscope, "scscope", do_scscope, -- EXTRA|NOTRLCOM|SBOXOK), -+ EXTRA|NOTRLCOM), - EX(CMD_set, "set", ex_set, - TRLBAR|EXTRA|CMDWIN|SBOXOK), - EX(CMD_setfiletype, "setfiletype", ex_setfiletype, - TRLBAR|EXTRA|NEEDARG|CMDWIN), - EX(CMD_setglobal, "setglobal", ex_set, -@@ -985,10 +989,12 @@ EX(CMD_unlockvar, "unlockvar", ex_lockva - BANG|EXTRA|NEEDARG|SBOXOK|CMDWIN), - EX(CMD_unmap, "unmap", ex_unmap, - BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), - EX(CMD_unmenu, "unmenu", ex_menu, - BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), -+EX(CMD_unsilent, "unsilent", ex_wrongmodifier, -+ NEEDARG|EXTRA|NOTRLCOM|SBOXOK|CMDWIN), - EX(CMD_update, "update", ex_update, - RANGE|WHOLEFOLD|BANG|FILE1|ARGOPT|DFLALL|TRLBAR), - EX(CMD_vglobal, "vglobal", ex_global, - RANGE|WHOLEFOLD|EXTRA|DFLALL|CMDWIN), - EX(CMD_version, "version", ex_version, ---- vim72.orig/src/ex_cmds2.c -+++ vim72/src/ex_cmds2.c -@@ -26,11 +26,12 @@ static void cmd_source __ARGS((char_u *f - * script when going through the list. */ - typedef struct scriptitem_S - { - char_u *sn_name; - # ifdef UNIX -- int sn_dev; -+ int sn_dev_valid; -+ dev_t sn_dev; - ino_t sn_ino; - # endif - # ifdef FEAT_PROFILE - int sn_prof_on; /* TRUE when script is/was profiled */ - int sn_pr_force; /* forceit: profile functions in this script */ -@@ -678,14 +679,13 @@ ex_breakdel(eap) - } - - /* - * ":breaklist". - */ --/*ARGSUSED*/ - void - ex_breaklist(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - struct debuggy *bp; - int i; - - if (dbg_breakp.ga_len == 0) -@@ -1090,11 +1090,11 @@ ex_profile(eap) - do_profiling = PROF_YES; - profile_zero(&prof_wait_time); - set_vim_var_nr(VV_PROFILING, 1L); - } - else if (do_profiling == PROF_NONE) -- EMSG(_("E750: First use :profile start <fname>")); -+ EMSG(_("E750: First use \":profile start {fname}\"")); - else if (STRCMP(eap->arg, "pause") == 0) - { - if (do_profiling == PROF_YES) - profile_start(&pause_time); - do_profiling = PROF_PAUSED; -@@ -1113,10 +1113,81 @@ ex_profile(eap) - /* The rest is similar to ":breakadd". */ - ex_breakadd(eap); - } - } - -+/* Command line expansion for :profile. */ -+static enum -+{ -+ PEXP_SUBCMD, /* expand :profile sub-commands */ -+ PEXP_FUNC, /* expand :profile func {funcname} */ -+} pexpand_what; -+ -+static char *pexpand_cmds[] = { -+ "start", -+#define PROFCMD_START 0 -+ "pause", -+#define PROFCMD_PAUSE 1 -+ "continue", -+#define PROFCMD_CONTINUE 2 -+ "func", -+#define PROFCMD_FUNC 3 -+ "file", -+#define PROFCMD_FILE 4 -+ NULL -+#define PROFCMD_LAST 5 -+}; -+ -+/* -+ * Function given to ExpandGeneric() to obtain the profile command -+ * specific expansion. -+ */ -+ char_u * -+get_profile_name(xp, idx) -+ expand_T *xp UNUSED; -+ int idx; -+{ -+ switch (pexpand_what) -+ { -+ case PEXP_SUBCMD: -+ return (char_u *)pexpand_cmds[idx]; -+ /* case PEXP_FUNC: TODO */ -+ default: -+ return NULL; -+ } -+} -+ -+/* -+ * Handle command line completion for :profile command. -+ */ -+ void -+set_context_in_profile_cmd(xp, arg) -+ expand_T *xp; -+ char_u *arg; -+{ -+ char_u *end_subcmd; -+ -+ /* Default: expand subcommands. */ -+ xp->xp_context = EXPAND_PROFILE; -+ pexpand_what = PEXP_SUBCMD; -+ xp->xp_pattern = arg; -+ -+ end_subcmd = skiptowhite(arg); -+ if (*end_subcmd == NUL) -+ return; -+ -+ if (end_subcmd - arg == 5 && STRNCMP(arg, "start", 5) == 0) -+ { -+ xp->xp_context = EXPAND_FILES; -+ xp->xp_pattern = skipwhite(end_subcmd); -+ return; -+ } -+ -+ /* TODO: expand function names after "func" */ -+ xp->xp_context = EXPAND_NOTHING; -+} -+ - /* - * Dump the profiling info. - */ - void - profile_dump() -@@ -1340,18 +1411,17 @@ autowrite_all() - } - - /* - * return TRUE if buffer was changed and cannot be abandoned. - */ --/*ARGSUSED*/ - int - check_changed(buf, checkaw, mult_win, forceit, allbuf) - buf_T *buf; - int checkaw; /* do autowrite if buffer was changed */ - int mult_win; /* check also when several wins for the buf */ - int forceit; -- int allbuf; /* may write all buffers */ -+ int allbuf UNUSED; /* may write all buffers */ - { - if ( !forceit - && bufIsChanged(buf) - && (mult_win || buf->b_nwindows <= 1) - && (!checkaw || autowrite(buf, forceit) == FAIL)) -@@ -1757,16 +1827,15 @@ set_arglist(str) - * "what" == AL_ADD: add files in 'str' to the argument list after "after". - * "what" == AL_DEL: remove files in 'str' from the argument list. - * - * Return FAIL for failure, OK otherwise. - */ --/*ARGSUSED*/ - static int - do_arglist(str, what, after) - char_u *str; -- int what; -- int after; /* 0 means before first one */ -+ int what UNUSED; -+ int after UNUSED; /* 0 means before first one */ - { - garray_T new_ga; - int exp_count; - char_u **exp_files; - int i; -@@ -2130,12 +2199,12 @@ do_argfile(eap, argn) - /* Edit the file; always use the last known line number. - * When it fails (e.g. Abort for already edited file) restore the - * argument index. */ - if (do_ecmd(0, alist_name(&ARGLIST[curwin->w_arg_idx]), NULL, - eap, ECMD_LAST, -- (P_HID(curwin->w_buffer) ? ECMD_HIDE : 0) + -- (eap->forceit ? ECMD_FORCEIT : 0)) == FAIL) -+ (P_HID(curwin->w_buffer) ? ECMD_HIDE : 0) -+ + (eap->forceit ? ECMD_FORCEIT : 0), curwin) == FAIL) - curwin->w_arg_idx = old_arg_idx; - /* like Vi: set the mark where the cursor is in the file. */ - else if (eap->cmdidx != CMD_argdo) - setmark('\''); - } -@@ -2496,43 +2565,44 @@ ex_compiler(eap) - { - /* ":compiler! {name}" sets local options. - * To remain backwards compatible "current_compiler" is always - * used. A user's compiler plugin may set it, the distributed - * plugin will then skip the settings. Afterwards set -- * "b:current_compiler" and restore "current_compiler". */ -- old_cur_comp = get_var_value((char_u *)"current_compiler"); -+ * "b:current_compiler" and restore "current_compiler". -+ * Explicitly prepend "g:" to make it work in a function. */ -+ old_cur_comp = get_var_value((char_u *)"g:current_compiler"); - if (old_cur_comp != NULL) - old_cur_comp = vim_strsave(old_cur_comp); - do_cmdline_cmd((char_u *) - "command -nargs=* CompilerSet setlocal <args>"); - } -- do_unlet((char_u *)"current_compiler", TRUE); -+ do_unlet((char_u *)"g:current_compiler", TRUE); - do_unlet((char_u *)"b:current_compiler", TRUE); - - sprintf((char *)buf, "compiler/%s.vim", eap->arg); - if (source_runtime(buf, TRUE) == FAIL) - EMSG2(_("E666: compiler not supported: %s"), eap->arg); - vim_free(buf); - - do_cmdline_cmd((char_u *)":delcommand CompilerSet"); - - /* Set "b:current_compiler" from "current_compiler". */ -- p = get_var_value((char_u *)"current_compiler"); -+ p = get_var_value((char_u *)"g:current_compiler"); - if (p != NULL) - set_internal_string_var((char_u *)"b:current_compiler", p); - - /* Restore "current_compiler" for ":compiler {name}". */ - if (!eap->forceit) - { - if (old_cur_comp != NULL) - { -- set_internal_string_var((char_u *)"current_compiler", -+ set_internal_string_var((char_u *)"g:current_compiler", - old_cur_comp); - vim_free(old_cur_comp); - } - else -- do_unlet((char_u *)"current_compiler", TRUE); -+ do_unlet((char_u *)"g:current_compiler", TRUE); - } - } - } - } - #endif -@@ -2547,15 +2617,14 @@ ex_runtime(eap) - source_runtime(eap->arg, eap->forceit); - } - - static void source_callback __ARGS((char_u *fname, void *cookie)); - --/*ARGSUSED*/ - static void - source_callback(fname, cookie) - char_u *fname; -- void *cookie; -+ void *cookie UNUSED; - { - (void)do_source(fname, FALSE, DOSO_NONE); - } - - /* -@@ -2678,14 +2747,13 @@ do_in_runtimepath(name, all, callback, c - - #if defined(FEAT_EVAL) && defined(FEAT_AUTOCMD) - /* - * ":options" - */ --/*ARGSUSED*/ - void - ex_options(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - cmd_source((char_u *)SYS_OPTWIN_FILE, NULL); - } - #endif - -@@ -2803,24 +2871,39 @@ source_level(cookie) - } - #endif - - static char_u *get_one_sourceline __ARGS((struct source_cookie *sp)); - --#if defined(WIN32) && defined(FEAT_CSCOPE) -+#if (defined(WIN32) && defined(FEAT_CSCOPE)) || defined(HAVE_FD_CLOEXEC) -+# define USE_FOPEN_NOINH - static FILE *fopen_noinh_readbin __ARGS((char *filename)); - - /* - * Special function to open a file without handle inheritance. -+ * When possible the handle is closed on exec(). - */ - static FILE * - fopen_noinh_readbin(filename) - char *filename; - { -+# ifdef WIN32 - int fd_tmp = mch_open(filename, O_RDONLY | O_BINARY | O_NOINHERIT, 0); -+# else -+ int fd_tmp = mch_open(filename, O_RDONLY, 0); -+# endif - - if (fd_tmp == -1) - return NULL; -+ -+# ifdef HAVE_FD_CLOEXEC -+ { -+ int fdflags = fcntl(fd_tmp, F_GETFD); -+ if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0) -+ fcntl(fd_tmp, F_SETFD, fdflags | FD_CLOEXEC); -+ } -+# endif -+ - return fdopen(fd_tmp, READBIN); - } - #endif - - -@@ -2840,10 +2923,11 @@ do_source(fname, check_other, is_vimrc) - struct source_cookie cookie; - char_u *save_sourcing_name; - linenr_T save_sourcing_lnum; - char_u *p; - char_u *fname_exp; -+ char_u *firstline = NULL; - int retval = FAIL; - #ifdef FEAT_EVAL - scid_T save_current_SID; - static scid_T last_current_SID = 0; - void *save_funccalp; -@@ -2895,11 +2979,11 @@ do_source(fname, check_other, is_vimrc) - - /* Apply SourcePre autocommands, they may get the file. */ - apply_autocmds(EVENT_SOURCEPRE, fname_exp, fname_exp, FALSE, curbuf); - #endif - --#if defined(WIN32) && defined(FEAT_CSCOPE) -+#ifdef USE_FOPEN_NOINH - cookie.fp = fopen_noinh_readbin((char *)fname_exp); - #else - cookie.fp = mch_fopen((char *)fname_exp, READBIN); - #endif - if (cookie.fp == NULL && check_other) -@@ -2916,11 +3000,11 @@ do_source(fname, check_other, is_vimrc) - { - if (*p == '_') - *p = '.'; - else - *p = '_'; --#if defined(WIN32) && defined(FEAT_CSCOPE) -+#ifdef USE_FOPEN_NOINH - cookie.fp = fopen_noinh_readbin((char *)fname_exp); - #else - cookie.fp = mch_fopen((char *)fname_exp, READBIN); - #endif - } -@@ -2990,38 +3074,43 @@ do_source(fname, check_other, is_vimrc) - cookie.fname = fname_exp; - cookie.dbg_tick = debug_tick; - - cookie.level = ex_nesting_level; - #endif --#ifdef FEAT_MBYTE -- cookie.conv.vc_type = CONV_NONE; /* no conversion */ -- -- /* Try reading the first few bytes to check for a UTF-8 BOM. */ -- { -- char_u buf[3]; -- -- if (fread((char *)buf, sizeof(char_u), (size_t)3, cookie.fp) -- == (size_t)3 -- && buf[0] == 0xef && buf[1] == 0xbb && buf[2] == 0xbf) -- /* Found BOM, setup conversion and skip over it. */ -- convert_setup(&cookie.conv, (char_u *)"utf-8", p_enc); -- else -- /* No BOM found, rewind. */ -- fseek(cookie.fp, 0L, SEEK_SET); -- } --#endif - - /* - * Keep the sourcing name/lnum, for recursive calls. - */ - save_sourcing_name = sourcing_name; - sourcing_name = fname_exp; - save_sourcing_lnum = sourcing_lnum; - sourcing_lnum = 0; - -+#ifdef FEAT_MBYTE -+ cookie.conv.vc_type = CONV_NONE; /* no conversion */ -+ -+ /* Read the first line so we can check for a UTF-8 BOM. */ -+ firstline = getsourceline(0, (void *)&cookie, 0); -+ if (firstline != NULL && STRLEN(firstline) >= 3 && firstline[0] == 0xef -+ && firstline[1] == 0xbb && firstline[2] == 0xbf) -+ { -+ /* Found BOM; setup conversion, skip over BOM and recode the line. */ -+ convert_setup(&cookie.conv, (char_u *)"utf-8", p_enc); -+ p = string_convert(&cookie.conv, firstline + 3, NULL); -+ if (p == NULL) -+ p = vim_strsave(firstline + 3); -+ if (p != NULL) -+ { -+ vim_free(firstline); -+ firstline = p; -+ } -+ } -+#endif -+ - #ifdef STARTUPTIME -- time_push(&tv_rel, &tv_start); -+ if (time_fd != NULL) -+ time_push(&tv_rel, &tv_start); - #endif - - #ifdef FEAT_EVAL - # ifdef FEAT_PROFILE - if (do_profiling == PROF_YES) -@@ -3047,11 +3136,11 @@ do_source(fname, check_other, is_vimrc) - && ( - # ifdef UNIX - /* Compare dev/ino when possible, it catches symbolic - * links. Also compare file names, the inode may change - * when the file was edited. */ -- ((stat_ok && si->sn_dev != -1) -+ ((stat_ok && si->sn_dev_valid) - && (si->sn_dev == st.st_dev - && si->sn_ino == st.st_ino)) || - # endif - fnamecmp(si->sn_name, fname_exp) == 0)) - break; -@@ -3074,15 +3163,16 @@ do_source(fname, check_other, is_vimrc) - si->sn_name = fname_exp; - fname_exp = NULL; - # ifdef UNIX - if (stat_ok) - { -+ si->sn_dev_valid = TRUE; - si->sn_dev = st.st_dev; - si->sn_ino = st.st_ino; - } - else -- si->sn_dev = -1; -+ si->sn_dev_valid = FALSE; - # endif - - /* Allocate the local script variables to use for this script. */ - new_script_vars(current_SID); - } -@@ -3109,13 +3199,12 @@ do_source(fname, check_other, is_vimrc) - #endif - - /* - * Call do_cmdline, which will call getsourceline() to get the lines. - */ -- do_cmdline(NULL, getsourceline, (void *)&cookie, -+ do_cmdline(firstline, getsourceline, (void *)&cookie, - DOCMD_VERBOSE|DOCMD_NOWAIT|DOCMD_REPEAT); -- - retval = OK; - - #ifdef FEAT_PROFILE - if (do_profiling == PROF_YES) - { -@@ -3143,13 +3232,16 @@ do_source(fname, check_other, is_vimrc) - if (sourcing_name != NULL) - smsg((char_u *)_("continuing in %s"), sourcing_name); - verbose_leave(); - } - #ifdef STARTUPTIME -- vim_snprintf(IObuff, IOSIZE, "sourcing %s", fname); -- time_msg(IObuff, &tv_start); -- time_pop(&tv_rel); -+ if (time_fd != NULL) -+ { -+ vim_snprintf((char *)IObuff, IOSIZE, "sourcing %s", fname); -+ time_msg((char *)IObuff, &tv_start); -+ time_pop(&tv_rel); -+ } - #endif - - #ifdef FEAT_EVAL - /* - * After a "finish" in debug mode, need to break at first command of next -@@ -3169,10 +3261,11 @@ almosttheend: - prof_child_exit(&wait_start); /* leaving a child now */ - # endif - #endif - fclose(cookie.fp); - vim_free(cookie.nextline); -+ vim_free(firstline); - #ifdef FEAT_MBYTE - convert_setup(&cookie.conv, NULL, NULL); - #endif - - theend: -@@ -3183,14 +3276,13 @@ theend: - #if defined(FEAT_EVAL) || defined(PROTO) - - /* - * ":scriptnames" - */ --/*ARGSUSED*/ - void - ex_scriptnames(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - int i; - - for (i = 1; i <= script_items.ga_len && !got_int; ++i) - if (SCRIPT_ITEM(i).sn_name != NULL) -@@ -3310,16 +3402,15 @@ fgets_cr(s, n, stream) - * Called by do_cmdline() when it's called from do_source(). - * - * Return a pointer to the line in allocated memory. - * Return NULL for end-of-file or some error. - */ --/* ARGSUSED */ - char_u * - getsourceline(c, cookie, indent) -- int c; /* not used */ -+ int c UNUSED; - void *cookie; -- int indent; /* not used */ -+ int indent UNUSED; - { - struct source_cookie *sp = (struct source_cookie *)cookie; - char_u *line; - char_u *p, *s; - -@@ -3366,11 +3457,11 @@ getsourceline(c, cookie, indent) - if (sp->nextline == NULL) - break; - p = skipwhite(sp->nextline); - if (*p != '\\') - break; -- s = alloc((int)(STRLEN(line) + STRLEN(p))); -+ s = alloc((unsigned)(STRLEN(line) + STRLEN(p))); - if (s == NULL) /* out of memory */ - break; - STRCPY(s, line); - STRCAT(s, p + 1); - vim_free(line); -@@ -3642,14 +3733,13 @@ script_line_end() - - /* - * ":scriptencoding": Set encoding conversion for a sourced script. - * Without the multi-byte feature it's simply ignored. - */ --/*ARGSUSED*/ - void - ex_scriptencoding(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - #ifdef FEAT_MBYTE - struct source_cookie *sp; - char_u *name; - -@@ -4094,14 +4184,13 @@ ex_language(eap) - # if defined(FEAT_CMDL_COMPL) || defined(PROTO) - /* - * Function given to ExpandGeneric() to obtain the possible arguments of the - * ":language" command. - */ --/*ARGSUSED*/ - char_u * - get_lang_arg(xp, idx) -- expand_T *xp; -+ expand_T *xp UNUSED; - int idx; - { - if (idx == 0) - return (char_u *)"messages"; - if (idx == 1) ---- vim72.orig/src/ex_docmd.c -+++ vim72/src/ex_docmd.c -@@ -24,14 +24,16 @@ typedef struct ucmd - { - char_u *uc_name; /* The command name */ - long_u uc_argt; /* The argument type */ - char_u *uc_rep; /* The command's replacement string */ - long uc_def; /* The default value for a range/count */ -- scid_T uc_scriptID; /* SID where the command was defined */ - int uc_compl; /* completion type */ --# if defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL) -+# ifdef FEAT_EVAL -+ scid_T uc_scriptID; /* SID where the command was defined */ -+# ifdef FEAT_CMDL_COMPL - char_u *uc_compl_arg; /* completion argument if any */ -+# endif - # endif - } ucmd_T; - - #define UC_BUFFER 1 /* -buffer: local to current buffer */ - -@@ -362,10 +364,11 @@ static void ex_tag_cmd __ARGS((exarg_T * - # define ex_lockvar ex_ni - # define ex_unlockvar ex_ni - # define ex_function ex_ni - # define ex_delfunction ex_ni - # define ex_return ex_ni -+# define ex_oldfiles ex_ni - #endif - static char_u *arg_all __ARGS((void)); - #ifdef FEAT_SESSION - static int makeopens __ARGS((FILE *fd, char_u *dirnow)); - static int put_view __ARGS((FILE *fd, win_T *wp, int add_edit, unsigned *flagp, int current_arg_idx)); -@@ -1575,15 +1578,14 @@ free_cmdlines(gap) - - /* - * If "fgetline" is get_loop_line(), return TRUE if the getline it uses equals - * "func". * Otherwise return TRUE when "fgetline" equals "func". - */ --/*ARGSUSED*/ - int - getline_equal(fgetline, cookie, func) - char_u *(*fgetline) __ARGS((int, void *, int)); -- void *cookie; /* argument for fgetline() */ -+ void *cookie UNUSED; /* argument for fgetline() */ - char_u *(*func) __ARGS((int, void *, int)); - { - #ifdef FEAT_EVAL - char_u *(*gp) __ARGS((int, void *, int)); - struct loop_cookie *cp; -@@ -1607,14 +1609,13 @@ getline_equal(fgetline, cookie, func) - #if defined(FEAT_EVAL) || defined(FEAT_MBYTE) || defined(PROTO) - /* - * If "fgetline" is get_loop_line(), return the cookie used by the original - * getline function. Otherwise return "cookie". - */ --/*ARGSUSED*/ - void * - getline_cookie(fgetline, cookie) -- char_u *(*fgetline) __ARGS((int, void *, int)); -+ char_u *(*fgetline) __ARGS((int, void *, int)) UNUSED; - void *cookie; /* argument for fgetline() */ - { - # ifdef FEAT_EVAL - char_u *(*gp) __ARGS((int, void *, int)); - struct loop_cookie *cp; -@@ -1676,12 +1677,12 @@ do_one_cmd(cmdlinep, sourcing, - linenr_T lnum; - long n; - char_u *errormsg = NULL; /* error message */ - exarg_T ea; /* Ex command arguments */ - long verbose_save = -1; -- int save_msg_scroll = 0; -- int did_silent = 0; -+ int save_msg_scroll = msg_scroll; -+ int save_msg_silent = -1; - int did_esilent = 0; - #ifdef HAVE_SANDBOX - int did_sandbox = FALSE; - #endif - cmdmod_T save_cmdmod; -@@ -1768,11 +1769,11 @@ do_one_cmd(cmdlinep, sourcing, - #endif - continue; - } - if (checkforcmd(&ea.cmd, "browse", 3)) - { --#ifdef FEAT_BROWSE -+#ifdef FEAT_BROWSE_CMD - cmdmod.browse = TRUE; - #endif - continue; - } - if (!checkforcmd(&ea.cmd, "botright", 2)) -@@ -1855,13 +1856,13 @@ do_one_cmd(cmdlinep, sourcing, - #endif - continue; - } - if (!checkforcmd(&ea.cmd, "silent", 3)) - break; -- ++did_silent; -+ if (save_msg_silent == -1) -+ save_msg_silent = msg_silent; - ++msg_silent; -- save_msg_scroll = msg_scroll; - if (*ea.cmd == '!' && !vim_iswhite(ea.cmd[-1])) - { - /* ":silent!", but not "silent !cmd" */ - ea.cmd = skipwhite(ea.cmd + 1); - ++emsg_silent; -@@ -1885,10 +1886,17 @@ do_one_cmd(cmdlinep, sourcing, - #ifdef FEAT_WINDOWS - cmdmod.split |= WSP_TOP; - #endif - continue; - -+ case 'u': if (!checkforcmd(&ea.cmd, "unsilent", 3)) -+ break; -+ if (save_msg_silent == -1) -+ save_msg_silent = msg_silent; -+ msg_silent = 0; -+ continue; -+ - case 'v': if (checkforcmd(&ea.cmd, "vertical", 4)) - { - #ifdef FEAT_VERTSPLIT - cmdmod.split |= WSP_VERT; - #endif -@@ -2683,23 +2691,27 @@ doend: - } - #endif - - cmdmod = save_cmdmod; - -- if (did_silent > 0) -+ if (save_msg_silent != -1) - { - /* messages could be enabled for a serious error, need to check if the - * counters don't become negative */ -- msg_silent -= did_silent; -- if (msg_silent < 0) -- msg_silent = 0; -+ if (!did_emsg || msg_silent > save_msg_silent) -+ msg_silent = save_msg_silent; - emsg_silent -= did_esilent; - if (emsg_silent < 0) - emsg_silent = 0; - /* Restore msg_scroll, it's set by file I/O commands, even when no - * message is actually displayed. */ - msg_scroll = save_msg_scroll; -+ -+ /* "silent reg" or "silent echo x" inside "redir" leaves msg_col -+ * somewhere in the line. Put it back in the first column. */ -+ if (redirecting()) -+ msg_col = 0; - } - - #ifdef HAVE_SANDBOX - if (did_sandbox) - --sandbox; -@@ -2729,11 +2741,11 @@ checkforcmd(pp, cmd, len) - int len; /* required length */ - { - int i; - - for (i = 0; cmd[i] != NUL; ++i) -- if (cmd[i] != (*pp)[i]) -+ if (((char_u *)cmd)[i] != (*pp)[i]) - break; - if (i >= len && !isalpha((*pp)[i])) - { - *pp = skipwhite(*pp + i); - return TRUE; -@@ -2746,15 +2758,14 @@ checkforcmd(pp, cmd, len) - * Start of the name can be found at eap->cmd. - * Returns pointer to char after the command name. - * "full" is set to TRUE if the whole command name matched. - * Returns NULL for an ambiguous user command. - */ --/*ARGSUSED*/ - static char_u * - find_command(eap, full) - exarg_T *eap; -- int *full; -+ int *full UNUSED; - { - int len; - char_u *p; - int i; - -@@ -2795,11 +2806,11 @@ find_command(eap, full) - if (*eap->cmd == 'd' && (p[-1] == 'l' || p[-1] == 'p')) - { - /* Check for ":dl", ":dell", etc. to ":deletel": that's - * :delete with the 'l' flag. Same for 'p'. */ - for (i = 0; i < len; ++i) -- if (eap->cmd[i] != "delete"[i]) -+ if (eap->cmd[i] != ((char_u *)"delete")[i]) - break; - if (i == len - 1) - { - --len; - if (p[-1] == 'l') -@@ -2976,15 +2987,17 @@ static struct cmdmod - {"keepalt", 5, FALSE}, - {"keepjumps", 5, FALSE}, - {"keepmarks", 3, FALSE}, - {"leftabove", 5, FALSE}, - {"lockmarks", 3, FALSE}, -+ {"noautocmd", 3, FALSE}, - {"rightbelow", 6, FALSE}, - {"sandbox", 3, FALSE}, - {"silent", 3, FALSE}, - {"tab", 3, TRUE}, - {"topleft", 2, FALSE}, -+ {"unsilent", 3, FALSE}, - {"verbose", 4, TRUE}, - {"vertical", 4, FALSE}, - }; - - /* -@@ -2998,11 +3011,11 @@ modifier_len(cmd) - int i, j; - char_u *p = cmd; - - if (VIM_ISDIGIT(*cmd)) - p = skipwhite(skipdigits(cmd)); -- for (i = 0; i < sizeof(cmdmods) / sizeof(struct cmdmod); ++i) -+ for (i = 0; i < (int)(sizeof(cmdmods) / sizeof(struct cmdmod)); ++i) - { - for (j = 0; p[j] != NUL; ++j) - if (p[j] != cmdmods[i].name[j]) - break; - if (!isalpha(p[j]) && j >= cmdmods[i].minlen -@@ -3026,11 +3039,11 @@ cmd_exists(name) - int i; - int j; - char_u *p; - - /* Check command modifiers. */ -- for (i = 0; i < sizeof(cmdmods) / sizeof(struct cmdmod); ++i) -+ for (i = 0; i < (int)(sizeof(cmdmods) / sizeof(struct cmdmod)); ++i) - { - for (j = 0; name[j] != NUL; ++j) - if (name[j] != cmdmods[i].name[j]) - break; - if (name[j] == NUL && j >= cmdmods[i].minlen) -@@ -3143,21 +3156,19 @@ set_one_cmd_context(xp, buff) - { - xp->xp_context = EXPAND_UNSUCCESSFUL; - return NULL; - } - for (ea.cmdidx = (cmdidx_T)0; (int)ea.cmdidx < (int)CMD_SIZE; -- ea.cmdidx = (cmdidx_T)((int)ea.cmdidx + 1)) -- if (STRNCMP(cmdnames[(int)ea.cmdidx].cmd_name, cmd, (size_t)len) == 0) -+ ea.cmdidx = (cmdidx_T)((int)ea.cmdidx + 1)) -+ if (STRNCMP(cmdnames[(int)ea.cmdidx].cmd_name, cmd, -+ (size_t)len) == 0) - break; - - #ifdef FEAT_USR_CMDS - if (cmd[0] >= 'A' && cmd[0] <= 'Z') -- { - while (ASCII_ISALNUM(*p) || *p == '*') /* Allow * wild card */ - ++p; -- len = (int)(p - cmd); -- } - #endif - } - - /* - * If the cursor is touching the command, and it ends in an alpha-numeric -@@ -3606,10 +3617,11 @@ set_one_cmd_context(xp, buff) - #ifdef FEAT_AUTOCMD - case CMD_autocmd: - return set_context_in_autocmd(xp, arg, FALSE); - - case CMD_doautocmd: -+ case CMD_doautoall: - return set_context_in_autocmd(xp, arg, TRUE); - #endif - case CMD_set: - set_context_in_set_cmd(xp, arg, 0); - break; -@@ -3678,10 +3690,22 @@ set_one_cmd_context(xp, buff) - break; - #endif - case CMD_highlight: - set_context_in_highlight_cmd(xp, arg); - break; -+#ifdef FEAT_CSCOPE -+ case CMD_cscope: -+ case CMD_lcscope: -+ case CMD_scscope: -+ set_context_in_cscope_cmd(xp, arg, ea.cmdidx); -+ break; -+#endif -+#ifdef FEAT_SIGNS -+ case CMD_sign: -+ set_context_in_sign_cmd(xp, arg); -+ break; -+#endif - #ifdef FEAT_LISTCMDS - case CMD_bdelete: - case CMD_bwipeout: - case CMD_bunload: - while ((xp->xp_pattern = vim_strchr(arg, ' ')) != NULL) -@@ -3778,10 +3802,18 @@ set_one_cmd_context(xp, buff) - } - else - xp->xp_context = EXPAND_NOTHING; - break; - #endif -+#if defined(FEAT_PROFILE) -+ case CMD_profile: -+ set_context_in_profile_cmd(xp, arg); -+ break; -+#endif -+ case CMD_behave: -+ xp->xp_context = EXPAND_BEHAVE; -+ break; - - #endif /* FEAT_CMDL_COMPL */ - - default: - break; -@@ -3801,11 +3833,11 @@ set_one_cmd_context(xp, buff) - char_u * - skip_range(cmd, ctx) - char_u *cmd; - int *ctx; /* pointer to xp_context or NULL */ - { -- int delim; -+ unsigned delim; - - while (vim_strchr((char_u *)" \t0123456789.$%'/?-+,;", *cmd) != NULL) - { - if (*cmd == '\'') - { -@@ -5031,14 +5063,13 @@ check_more(message, forceit) - - #ifdef FEAT_CMDL_COMPL - /* - * Function given to ExpandGeneric() to obtain the list of command names. - */ --/*ARGSUSED*/ - char_u * - get_command_name(xp, idx) -- expand_T *xp; -+ expand_T *xp UNUSED; - int idx; - { - if (idx >= (int)CMD_SIZE) - # ifdef FEAT_USR_CMDS - return get_user_command_name(idx); -@@ -5119,11 +5150,15 @@ uc_add_command(name, name_len, rep, argt - EMSG(_("E174: Command already exists: add ! to replace it")); - goto fail; - } - - vim_free(cmd->uc_rep); -- cmd->uc_rep = 0; -+ cmd->uc_rep = NULL; -+#if defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL) -+ vim_free(cmd->uc_compl_arg); -+ cmd->uc_compl_arg = NULL; -+#endif - break; - } - - /* Stop as soon as we pass the name to add */ - if (cmp < 0) -@@ -5178,10 +5213,13 @@ static struct - } command_complete[] = - { - {EXPAND_AUGROUP, "augroup"}, - {EXPAND_BUFFERS, "buffer"}, - {EXPAND_COMMANDS, "command"}, -+#if defined(FEAT_CSCOPE) -+ {EXPAND_CSCOPE, "cscope"}, -+#endif - #if defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL) - {EXPAND_USER_DEFINED, "custom"}, - {EXPAND_USER_LIST, "customlist"}, - #endif - {EXPAND_DIRECTORIES, "dir"}, -@@ -5194,10 +5232,13 @@ static struct - {EXPAND_HIGHLIGHT, "highlight"}, - {EXPAND_MAPPINGS, "mapping"}, - {EXPAND_MENUS, "menu"}, - {EXPAND_SETTINGS, "option"}, - {EXPAND_SHELLCMD, "shellcmd"}, -+#if defined(FEAT_SIGNS) -+ {EXPAND_SIGN, "sign"}, -+#endif - {EXPAND_TAGS, "tag"}, - {EXPAND_TAGS_LISTFILES, "tag_listfiles"}, - {EXPAND_USER_VARS, "var"}, - {0, NULL} - }; -@@ -5477,10 +5518,13 @@ invalid_count: - } - - return OK; - } - -+/* -+ * ":command ..." -+ */ - static void - ex_command(eap) - exarg_T *eap; - { - char_u *name; -@@ -5538,14 +5582,13 @@ ex_command(eap) - - /* - * ":comclear" - * Clear all user commands, global and for current buffer. - */ --/*ARGSUSED*/ - void - ex_comclear(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - uc_clear(&ucmds); - uc_clear(&curbuf->b_ucmds); - } - -@@ -5908,11 +5951,12 @@ do_ucmd(eap) - char_u *buf; - char_u *p; - char_u *q; - - char_u *start; -- char_u *end; -+ char_u *end = NULL; -+ char_u *ksp; - size_t len, totlen; - - size_t split_len = 0; - char_u *split_buf = NULL; - ucmd_T *cmd; -@@ -5925,20 +5969,55 @@ do_ucmd(eap) - else - cmd = USER_CMD_GA(&curbuf->b_ucmds, eap->useridx); - - /* - * Replace <> in the command by the arguments. -+ * First round: "buf" is NULL, compute length, allocate "buf". -+ * Second round: copy result into "buf". - */ - buf = NULL; - for (;;) - { -- p = cmd->uc_rep; -- q = buf; -+ p = cmd->uc_rep; /* source */ -+ q = buf; /* destination */ - totlen = 0; -- while ((start = vim_strchr(p, '<')) != NULL -- && (end = vim_strchr(start + 1, '>')) != NULL) -+ -+ for (;;) - { -+ start = vim_strchr(p, '<'); -+ if (start != NULL) -+ end = vim_strchr(start + 1, '>'); -+ if (buf != NULL) -+ { -+ ksp = vim_strchr(p, K_SPECIAL); -+ if (ksp != NULL && (start == NULL || ksp < start || end == NULL) -+ && ((ksp[1] == KS_SPECIAL && ksp[2] == KE_FILLER) -+# ifdef FEAT_GUI -+ || (ksp[1] == KS_EXTRA && ksp[2] == (int)KE_CSI) -+# endif -+ )) -+ { -+ /* K_SPECIAL han been put in the buffer as K_SPECIAL -+ * KS_SPECIAL KE_FILLER, like for mappings, but -+ * do_cmdline() doesn't handle that, so convert it back. -+ * Also change K_SPECIAL KS_EXTRA KE_CSI into CSI. */ -+ len = ksp - p; -+ if (len > 0) -+ { -+ mch_memmove(q, p, len); -+ q += len; -+ } -+ *q++ = ksp[1] == KS_SPECIAL ? K_SPECIAL : CSI; -+ p = ksp + 3; -+ continue; -+ } -+ } -+ -+ /* break if there no <item> is found */ -+ if (start == NULL || end == NULL) -+ break; -+ - /* Include the '>' */ - ++end; - - /* Take everything up to the '<' */ - len = start - p; -@@ -6001,14 +6080,13 @@ get_user_command_name(idx) - } - - /* - * Function given to ExpandGeneric() to obtain the list of user command names. - */ --/*ARGSUSED*/ - char_u * - get_user_commands(xp, idx) -- expand_T *xp; -+ expand_T *xp UNUSED; - int idx; - { - if (idx < curbuf->b_ucmds.ga_len) - return USER_CMD_GA(&curbuf->b_ucmds, idx)->uc_name; - idx -= curbuf->b_ucmds.ga_len; -@@ -6019,48 +6097,45 @@ get_user_commands(xp, idx) - - /* - * Function given to ExpandGeneric() to obtain the list of user command - * attributes. - */ --/*ARGSUSED*/ - char_u * - get_user_cmd_flags(xp, idx) -- expand_T *xp; -+ expand_T *xp UNUSED; - int idx; - { - static char *user_cmd_flags[] = - {"bang", "bar", "buffer", "complete", "count", - "nargs", "range", "register"}; - -- if (idx >= sizeof(user_cmd_flags) / sizeof(user_cmd_flags[0])) -+ if (idx >= (int)(sizeof(user_cmd_flags) / sizeof(user_cmd_flags[0]))) - return NULL; - return (char_u *)user_cmd_flags[idx]; - } - - /* - * Function given to ExpandGeneric() to obtain the list of values for -nargs. - */ --/*ARGSUSED*/ - char_u * - get_user_cmd_nargs(xp, idx) -- expand_T *xp; -+ expand_T *xp UNUSED; - int idx; - { - static char *user_cmd_nargs[] = {"0", "1", "*", "?", "+"}; - -- if (idx >= sizeof(user_cmd_nargs) / sizeof(user_cmd_nargs[0])) -+ if (idx >= (int)(sizeof(user_cmd_nargs) / sizeof(user_cmd_nargs[0]))) - return NULL; - return (char_u *)user_cmd_nargs[idx]; - } - - /* - * Function given to ExpandGeneric() to obtain the list of values for -complete. - */ --/*ARGSUSED*/ - char_u * - get_user_cmd_complete(xp, idx) -- expand_T *xp; -+ expand_T *xp UNUSED; - int idx; - { - return (char_u *)command_complete[idx].name; - } - # endif /* FEAT_CMDL_COMPL */ -@@ -6234,14 +6309,13 @@ ex_quit(eap) - } - - /* - * ":cquit". - */ --/*ARGSUSED*/ - static void - ex_cquit(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - getout(1); /* this does not always pass on the exit code to the Manx - compiler. why? */ - } - -@@ -6679,14 +6753,13 @@ ex_goto(eap) - #endif - - /* - * ":shell". - */ --/*ARGSUSED*/ - static void - ex_shell(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - do_shell(NULL, 0); - } - - #if (defined(FEAT_WINDOWS) && defined(HAVE_DROP_FILE)) \ -@@ -6986,14 +7059,13 @@ alist_slash_adjust() - #endif - - /* - * ":preserve". - */ --/*ARGSUSED*/ - static void - ex_preserve(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - curbuf->b_flags |= BF_PRESERVED; - ml_preserve(curbuf, TRUE); - } - -@@ -7221,14 +7293,13 @@ ex_tabmove(eap) - } - - /* - * :tabs command: List tabs and their contents. - */ --/*ARGSUSED*/ - static void - ex_tabs(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - tabpage_T *tp; - win_T *wp; - int tabcount = 1; - -@@ -7411,11 +7482,10 @@ ex_edit(eap) - } - - /* - * ":edit <file>" command and alikes. - */ --/*ARGSUSED*/ - void - do_exedit(eap, old_curwin) - exarg_T *eap; - win_T *old_curwin; /* curwin before doing a split or NULL */ - { -@@ -7483,11 +7553,12 @@ do_exedit(eap, old_curwin) - ) && *eap->arg == NUL) - { - /* ":new" or ":tabnew" without argument: edit an new empty buffer */ - setpcmark(); - (void)do_ecmd(0, NULL, NULL, eap, ECMD_ONE, -- ECMD_HIDE + (eap->forceit ? ECMD_FORCEIT : 0)); -+ ECMD_HIDE + (eap->forceit ? ECMD_FORCEIT : 0), -+ old_curwin == NULL ? curwin : NULL); - } - else if ((eap->cmdidx != CMD_split - #ifdef FEAT_VERTSPLIT - && eap->cmdidx != CMD_vsplit - #endif -@@ -7520,11 +7591,11 @@ do_exedit(eap, old_curwin) - (P_HID(curbuf) ? ECMD_HIDE : 0) - + (eap->forceit ? ECMD_FORCEIT : 0) - #ifdef FEAT_LISTCMDS - + (eap->cmdidx == CMD_badd ? ECMD_ADDBUF : 0 ) - #endif -- ) == FAIL) -+ , old_curwin == NULL ? curwin : NULL) == FAIL) - { - /* Editing the file failed. If the window was split, close it. */ - #ifdef FEAT_WINDOWS - if (old_curwin != NULL) - { -@@ -7622,14 +7693,13 @@ ex_popup(eap) - { - gui_make_popup(eap->arg, eap->forceit); - } - #endif - --/*ARGSUSED*/ - static void - ex_swapname(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - if (curbuf->b_ml.ml_mfp == NULL || curbuf->b_ml.ml_mfp->mf_fname == NULL) - MSG(_("No swap file")); - else - msg(curbuf->b_ml.ml_mfp->mf_fname); -@@ -7638,14 +7708,13 @@ ex_swapname(eap) - /* - * ":syncbind" forces all 'scrollbind' windows to have the same relative - * offset. - * (1998-11-02 16:21:01 R. Edward Ralston <eralston@computer.org>) - */ --/*ARGSUSED*/ - static void - ex_syncbind(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - #ifdef FEAT_SCROLLBIND - win_T *wp; - long topline; - long y; -@@ -7782,14 +7851,14 @@ ex_read(eap) - else - lnum = 1; - if (*ml_get(lnum) == NUL && u_savedel(lnum, 1L) == OK) - { - ml_delete(lnum, FALSE); -- deleted_lines_mark(lnum, 1L); - if (curwin->w_cursor.lnum > 1 - && curwin->w_cursor.lnum >= lnum) - --curwin->w_cursor.lnum; -+ deleted_lines_mark(lnum, 1L); - } - } - redraw_curbuf_later(VALID); - } - } -@@ -7801,10 +7870,13 @@ static char_u *prev_dir = NULL; - void - free_cd_dir() - { - vim_free(prev_dir); - prev_dir = NULL; -+ -+ vim_free(globaldir); -+ globaldir = NULL; - } - #endif - - - /* -@@ -7823,10 +7895,14 @@ ex_cd(eap) - if (*new_dir == NUL) - ex_pwd(NULL); - else - #endif - { -+#ifdef FEAT_AUTOCMD -+ if (allbuf_locked()) -+ return; -+#endif - if (vim_strchr(p_cpo, CPO_CHDIR) != NULL && curbufIsChanged() - && !eap->forceit) - { - EMSG(_("E747: Cannot change directory, buffer is modified (add ! to override)")); - return; -@@ -7894,24 +7970,23 @@ ex_cd(eap) - } - - shorten_fnames(TRUE); - - /* Echo the new current directory if the command was typed. */ -- if (KeyTyped) -+ if (KeyTyped || p_verbose >= 5) - ex_pwd(eap); - } - vim_free(tofree); - } - } - - /* - * ":pwd". - */ --/*ARGSUSED*/ - static void - ex_pwd(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - if (mch_dirname(NameBuff, MAXPATHL) == OK) - { - #ifdef BACKSLASH_IN_FILENAME - slash_adjust(NameBuff); -@@ -8289,10 +8364,11 @@ ex_join(eap) - static void - ex_at(eap) - exarg_T *eap; - { - int c; -+ int prev_len = typebuf.tb_len; - - curwin->w_cursor.lnum = eap->line2; - - #ifdef USE_ON_FLY_SCROLL - dont_scroll = TRUE; /* disallow scrolling here */ -@@ -8314,15 +8390,14 @@ ex_at(eap) - - exec_from_reg = TRUE; - - /* - * Execute from the typeahead buffer. -- * Originally this didn't check for the typeahead buffer to be empty, -- * thus could read more Ex commands from stdin. It's not clear why, -- * it is certainly unexpected. -+ * Continue until the stuff buffer is empty and all added characters -+ * have been consumed. - */ -- while ((!stuff_empty() || typebuf.tb_len > 0) && vpeekc() == ':') -+ while (!stuff_empty() || typebuf.tb_len > prev_len) - (void)do_cmdline(NULL, getexline, NULL, DOCMD_NOWAIT|DOCMD_VERBOSE); - - exec_from_reg = save_efr; - } - } -@@ -8338,36 +8413,33 @@ ex_bang(eap) - } - - /* - * ":undo". - */ --/*ARGSUSED*/ - static void - ex_undo(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - if (eap->addr_count == 1) /* :undo 123 */ - undo_time(eap->line2, FALSE, TRUE); - else - u_undo(1); - } - - /* - * ":redo". - */ --/*ARGSUSED*/ - static void - ex_redo(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - u_redo(1); - } - - /* - * ":earlier" and ":later". - */ --/*ARGSUSED*/ - static void - ex_later(eap) - exarg_T *eap; - { - long count = 0; -@@ -8548,14 +8620,13 @@ ex_redraw(eap) - } - - /* - * ":redrawstatus": force redraw of status line(s) - */ --/*ARGSUSED*/ - static void - ex_redrawstatus(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - #if defined(FEAT_WINDOWS) - int r = RedrawingDisabled; - int p = p_lz; - -@@ -8628,10 +8699,12 @@ ex_mkrc(eap) - return; - #endif - } - - #ifdef FEAT_SESSION -+ /* Use the short file name until ":lcd" is used. We also don't use the -+ * short file name when 'acd' is set, that is checked later. */ - did_lcd = FALSE; - - /* ":mkview" or ":mkview 9": generate file name with 'viewdir' */ - if (eap->cmdidx == CMD_mkview - && (*eap->arg == NUL -@@ -8747,12 +8820,12 @@ ex_mkrc(eap) - shorten_fnames(TRUE); - } - else if (*dirnow != NUL - && (ssop_flags & SSOP_CURDIR) && globaldir != NULL) - { -- (void)mch_chdir((char *)globaldir); -- shorten_fnames(TRUE); -+ if (mch_chdir((char *)globaldir) == 0) -+ shorten_fnames(TRUE); - } - - failed |= (makeopens(fd, dirnow) == FAIL); - - /* restore original dir */ -@@ -8812,15 +8885,14 @@ theend: - #endif - } - - #if ((defined(FEAT_SESSION) || defined(FEAT_EVAL)) && defined(vim_mkdir)) \ - || defined(PROTO) --/*ARGSUSED*/ - int - vim_mkdir_emsg(name, prot) - char_u *name; -- int prot; -+ int prot UNUSED; - { - if (vim_mkdir(name, prot) != 0) - { - EMSG2(_("E739: Cannot create directory: %s"), name); - return FAIL; -@@ -9087,14 +9159,13 @@ ex_startinsert(eap) - } - - /* - * ":stopinsert" - */ --/*ARGSUSED*/ - static void - ex_stopinsert(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - restart_edit = 0; - stop_insert_mode = TRUE; - } - #endif -@@ -9364,13 +9435,12 @@ find_cmdline_var(src, usedlen) - #ifdef FEAT_CLIENTSERVER - "<client>" - # define SPEC_CLIENT 9 - #endif - }; --#define SPEC_COUNT (sizeof(spec_str) / sizeof(char *)) - -- for (i = 0; i < SPEC_COUNT; ++i) -+ for (i = 0; i < (int)(sizeof(spec_str) / sizeof(char *)); ++i) - { - len = (int)STRLEN(spec_str[i]); - if (STRNCMP(src, spec_str[i], len) == 0) - { - *usedlen = len; -@@ -9504,28 +9574,54 @@ eval_vars(src, srcstart, usedlen, lnump, - skip_mod = TRUE; - #endif - break; - } - s = src + 1; -+ if (*s == '<') /* "#<99" uses v:oldfiles */ -+ ++s; - i = (int)getdigits(&s); - *usedlen = (int)(s - src); /* length of what we expand */ - -- buf = buflist_findnr(i); -- if (buf == NULL) -+ if (src[1] == '<') - { -- *errormsg = (char_u *)_("E194: No alternate file name to substitute for '#'"); -+ if (*usedlen < 2) -+ { -+ /* Should we give an error message for #<text? */ -+ *usedlen = 1; -+ return NULL; -+ } -+#ifdef FEAT_EVAL -+ result = list_find_str(get_vim_var_list(VV_OLDFILES), -+ (long)i); -+ if (result == NULL) -+ { -+ *errormsg = (char_u *)""; -+ return NULL; -+ } -+#else -+ *errormsg = (char_u *)_("E809: #< is not available without the +eval feature"); - return NULL; -+#endif - } -- if (lnump != NULL) -- *lnump = ECMD_LAST; -- if (buf->b_fname == NULL) -+ else - { -- result = (char_u *)""; -- valid = 0; /* Must have ":p:h" to be valid */ -+ buf = buflist_findnr(i); -+ if (buf == NULL) -+ { -+ *errormsg = (char_u *)_("E194: No alternate file name to substitute for '#'"); -+ return NULL; -+ } -+ if (lnump != NULL) -+ *lnump = ECMD_LAST; -+ if (buf->b_fname == NULL) -+ { -+ result = (char_u *)""; -+ valid = 0; /* Must have ":p:h" to be valid */ -+ } -+ else -+ result = buf->b_fname; - } -- else -- result = buf->b_fname; - break; - - #ifdef FEAT_SEARCHPATH - case SPEC_CFILE: /* file name under cursor */ - result = file_name_at_cursor(FNAME_MESS|FNAME_HYP, 1L, NULL); -@@ -9539,10 +9635,19 @@ eval_vars(src, srcstart, usedlen, lnump, - #endif - - #ifdef FEAT_AUTOCMD - case SPEC_AFILE: /* file name for autocommand */ - result = autocmd_fname; -+ if (result != NULL && !autocmd_fname_full) -+ { -+ /* Still need to turn the fname into a full path. It is -+ * postponed to avoid a delay when <afile> is not used. */ -+ autocmd_fname_full = TRUE; -+ result = FullName_save(autocmd_fname, FALSE); -+ vim_free(autocmd_fname); -+ autocmd_fname = result; -+ } - if (result == NULL) - { - *errormsg = (char_u *)_("E495: no autocommand file name to substitute for \"<afile>\""); - return NULL; - } -@@ -9682,11 +9787,11 @@ arg_all() - retval[len] = NUL; - break; - } - - /* allocate memory */ -- retval = alloc(len + 1); -+ retval = alloc((unsigned)len + 1); - if (retval == NULL) - break; - } - - return retval; -@@ -10065,11 +10170,11 @@ makeopens(fd, dirnow) - /* - * Lastly, execute the x.vim file if it exists. - */ - if (put_line(fd, "let s:sx = expand(\"<sfile>:p:r\").\"x.vim\"") == FAIL - || put_line(fd, "if file_readable(s:sx)") == FAIL -- || put_line(fd, " exe \"source \" . s:sx") == FAIL -+ || put_line(fd, " exe \"source \" . fnameescape(s:sx)") == FAIL - || put_line(fd, "endif") == FAIL) - return FAIL; - - return OK; - } -@@ -10483,10 +10588,13 @@ ses_fname(fd, buf, flagp) - * Don't do this after ":lcd", we don't keep track of what the current - * directory is. */ - if (buf->b_sfname != NULL - && flagp == &ssop_flags - && (ssop_flags & (SSOP_CURDIR | SSOP_SESDIR)) -+#ifdef FEAT_AUTOCHDIR -+ && !p_acd -+#endif - && !did_lcd) - name = buf->b_sfname; - else - name = buf->b_ffname; - if (ses_put_fname(fd, name, flagp) == FAIL || put_eol(fd) == FAIL) -@@ -10687,11 +10795,12 @@ ex_viminfo(eap) - save_viminfo = p_viminfo; - if (*p_viminfo == NUL) - p_viminfo = (char_u *)"'100"; - if (eap->cmdidx == CMD_rviminfo) - { -- if (read_viminfo(eap->arg, TRUE, TRUE, eap->forceit) == FAIL) -+ if (read_viminfo(eap->arg, VIF_WANT_INFO | VIF_WANT_MARKS -+ | (eap->forceit ? VIF_FORCEIT : 0)) == FAIL) - EMSG(_("E195: Cannot open viminfo file for reading")); - } - else - write_viminfo(eap->arg, eap->forceit); - p_viminfo = save_viminfo; -@@ -10739,10 +10848,28 @@ ex_behave(eap) - } - else - EMSG2(_(e_invarg2), eap->arg); - } - -+#if defined(FEAT_CMDL_COMPL) || defined(PROTO) -+/* -+ * Function given to ExpandGeneric() to obtain the possible arguments of the -+ * ":behave {mswin,xterm}" command. -+ */ -+ char_u * -+get_behave_arg(xp, idx) -+ expand_T *xp UNUSED; -+ int idx; -+{ -+ if (idx == 0) -+ return (char_u *)"mswin"; -+ if (idx == 1) -+ return (char_u *)"xterm"; -+ return NULL; -+} -+#endif -+ - #ifdef FEAT_AUTOCMD - static int filetype_detect = FALSE; - static int filetype_plugin = FALSE; - static int filetype_indent = FALSE; - -@@ -10848,14 +10975,13 @@ ex_setfiletype(eap) - if (!did_filetype) - set_option_value((char_u *)"filetype", 0L, eap->arg, OPT_LOCAL); - } - #endif - --/*ARGSUSED*/ - static void - ex_digraphs(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - #ifdef FEAT_DIGRAPHS - if (*eap->arg != NUL) - putdigraph(eap->arg); - else -@@ -10885,14 +11011,13 @@ ex_set(eap) - - #ifdef FEAT_SEARCH_EXTRA - /* - * ":nohlsearch" - */ --/*ARGSUSED*/ - static void - ex_nohlsearch(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - no_hlsearch = TRUE; - redraw_all_later(SOME_VALID); - } - -@@ -10967,14 +11092,13 @@ ex_match(eap) - - #ifdef FEAT_CRYPT - /* - * ":X": Get crypt key - */ --/*ARGSUSED*/ - static void - ex_X(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - (void)get_crypt_key(TRUE, TRUE); - } - #endif - ---- vim72.orig/src/ex_eval.c -+++ vim72/src/ex_eval.c -@@ -58,11 +58,13 @@ static char_u *get_end_emsg __ARGS((stru - # define THROW_ON_INTERRUPT (!eval_to_number("$VIMNOINTTHROW")) - # define THROW_TEST - #else - /* Values used for the Vim release. */ - # define THROW_ON_ERROR TRUE -+# define THROW_ON_ERROR_TRUE - # define THROW_ON_INTERRUPT TRUE -+# define THROW_ON_INTERRUPT_TRUE - #endif - - static void catch_exception __ARGS((except_T *excp)); - static void finish_exception __ARGS((except_T *excp)); - static void discard_exception __ARGS((except_T *excp, int was_finished)); -@@ -1318,20 +1320,24 @@ do_throw(cstack) - * if a previous error or interrupt has not been converted to an exception, - * inactivate the try conditional, too, as if the conversion had been done, - * and reset the did_emsg or got_int flag, so this won't happen again at - * the next surrounding try conditional. - */ -+#ifndef THROW_ON_ERROR_TRUE - if (did_emsg && !THROW_ON_ERROR) - { - inactivate_try = TRUE; - did_emsg = FALSE; - } -+#endif -+#ifndef THROW_ON_INTERRUPT_TRUE - if (got_int && !THROW_ON_INTERRUPT) - { - inactivate_try = TRUE; - got_int = FALSE; - } -+#endif - idx = cleanup_conditionals(cstack, 0, inactivate_try); - if (idx >= 0) - { - /* - * If this try conditional is active and we are before its first -@@ -2252,14 +2258,13 @@ rewind_conditionals(cstack, idx, cond_ty - } - - /* - * ":endfunction" when not after a ":function" - */ --/*ARGSUSED*/ - void - ex_endfunction(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - EMSG(_("E193: :endfunction not inside a function")); - } - - /* ---- vim72.orig/src/ex_getln.c -+++ vim72/src/ex_getln.c -@@ -29,18 +29,24 @@ struct cmdline_info - int cmdindent; /* number of spaces before cmdline */ - char_u *cmdprompt; /* message in front of cmdline */ - int cmdattr; /* attributes for prompt */ - int overstrike; /* Typing mode on the command line. Shared by - getcmdline() and put_on_cmdline(). */ -+ expand_T *xpc; /* struct being used for expansion, xp_pattern -+ may point into cmdbuff */ - int xp_context; /* type of expansion */ - # ifdef FEAT_EVAL - char_u *xp_arg; /* user-defined expansion arg */ - int input_fn; /* when TRUE Invoked for input() function */ - # endif - }; - --static struct cmdline_info ccline; /* current cmdline_info */ -+/* The current cmdline_info. It is initialized in getcmdline() and after that -+ * used by other functions. When invoking getcmdline() recursively it needs -+ * to be saved with save_cmdline() and restored with restore_cmdline(). -+ * TODO: make it local to getcmdline() and pass it around. */ -+static struct cmdline_info ccline; - - static int cmd_showtail; /* Only show path tail in lists ? */ - - #ifdef FEAT_EVAL - static int new_cmdpos; /* position set by set_cmdline_pos() */ -@@ -132,15 +138,14 @@ static int ex_window __ARGS((void)); - * Careful: getcmdline() can be called recursively! - * - * Return pointer to allocated string if there is a commandline, NULL - * otherwise. - */ --/*ARGSUSED*/ - char_u * - getcmdline(firstc, count, indent) - int firstc; -- long count; /* only used for incremental search */ -+ long count UNUSED; /* only used for incremental search */ - int indent; /* indent for inside conditionals */ - { - int c; - int i; - int j; -@@ -236,10 +241,11 @@ getcmdline(firstc, count, indent) - ccline.cmdspos = indent; - ccline.cmdlen = indent; - } - - ExpandInit(&xpc); -+ ccline.xpc = &xpc; - - #ifdef FEAT_RIGHTLEFT - if (curwin->w_p_rl && *curwin->w_p_rlc == 's' - && (firstc == '/' || firstc == '?')) - cmdmsg_rl = TRUE; -@@ -316,11 +322,11 @@ getcmdline(firstc, count, indent) - hiscnt = hislen; /* set hiscnt to impossible history value */ - histype = hist_char2type(firstc); - #endif - - #ifdef FEAT_DIGRAPHS -- do_digraph(-1); /* init digraph typahead */ -+ do_digraph(-1); /* init digraph typeahead */ - #endif - - /* - * Collect the command string, handling editing keys. - */ -@@ -406,13 +412,14 @@ getcmdline(firstc, count, indent) - lookfor = NULL; - } - #endif - - /* -- * <S-Tab> works like CTRL-P (unless 'wc' is <S-Tab>). -+ * When there are matching completions to select <S-Tab> works like -+ * CTRL-P (unless 'wc' is <S-Tab>). - */ -- if (c != p_wc && c == K_S_TAB && xpc.xp_numfiles != -1) -+ if (c != p_wc && c == K_S_TAB && xpc.xp_numfiles > 0) - c = Ctrl_P; - - #ifdef FEAT_WILDMENU - /* Special translations for 'wildmenu' */ - if (did_wild_list && p_wmnu) -@@ -1511,10 +1518,11 @@ getcmdline(firstc, count, indent) - char_u *p; - int len; - int old_firstc; - - vim_free(ccline.cmdbuff); -+ xpc.xp_context = EXPAND_NOTHING; - if (hiscnt == hislen) - p = lookfor; /* back to the old one */ - else - p = history[histype][hiscnt].hisstr; - -@@ -1837,10 +1845,11 @@ returncmd: - #ifdef FEAT_FKMAP - cmd_fkmap = 0; - #endif - - ExpandCleanup(&xpc); -+ ccline.xpc = NULL; - - #ifdef FEAT_SEARCH_EXTRA - if (did_incsearch) - { - curwin->w_cursor = old_cursor; -@@ -1988,21 +1997,36 @@ text_locked_msg() - EMSG(_(e_secure)); - } - - #if defined(FEAT_AUTOCMD) || defined(PROTO) - /* -- * Check if "curbuf_lock" is set and return TRUE when it is and give an error -- * message. -+ * Check if "curbuf_lock" or "allbuf_lock" is set and return TRUE when it is -+ * and give an error message. - */ - int - curbuf_locked() - { - if (curbuf_lock > 0) - { - EMSG(_("E788: Not allowed to edit another buffer now")); - return TRUE; - } -+ return allbuf_locked(); -+} -+ -+/* -+ * Check if "allbuf_lock" is set and return TRUE when it is and give an error -+ * message. -+ */ -+ int -+allbuf_locked() -+{ -+ if (allbuf_lock > 0) -+ { -+ EMSG(_("E811: Not allowed to change buffer information now")); -+ return TRUE; -+ } - return FALSE; - } - #endif - - static int -@@ -2086,15 +2110,14 @@ correct_cmdspos(idx, cells) - #endif - - /* - * Get an Ex command line for the ":" command. - */ --/* ARGSUSED */ - char_u * --getexline(c, dummy, indent) -+getexline(c, cookie, indent) - int c; /* normally ':', NUL for ":append" */ -- void *dummy; /* cookie not used */ -+ void *cookie UNUSED; - int indent; /* indent for inside conditionals */ - { - /* When executing a register, remove ':' that's in front of each line. */ - if (exec_from_reg && vpeekc() == ':') - (void)vgetc(); -@@ -2105,16 +2128,15 @@ getexline(c, dummy, indent) - * Get an Ex command line for Ex mode. - * In Ex mode we only use the OS supplied line editing features and no - * mappings or abbreviations. - * Returns a string in allocated memory or NULL. - */ --/* ARGSUSED */ - char_u * --getexmodeline(promptc, dummy, indent) -+getexmodeline(promptc, cookie, indent) - int promptc; /* normally ':', NUL for ":append" and '?' for - :s prompt */ -- void *dummy; /* cookie not used */ -+ void *cookie UNUSED; - int indent; /* indent for inside conditionals */ - { - garray_T line_ga; - char_u *pend; - int startcol = 0; -@@ -2169,11 +2191,10 @@ getexmodeline(promptc, dummy, indent) - got_int = FALSE; - while (!got_int) - { - if (ga_grow(&line_ga, 40) == FAIL) - break; -- pend = (char_u *)line_ga.ga_data + line_ga.ga_len; - - /* Get one character at a time. Don't use inchar(), it can't handle - * special characters. */ - prev_char = c1; - c1 = vgetc(); -@@ -2506,10 +2527,24 @@ realloc_cmdbuff(len) - ccline.cmdbuff = p; /* keep the old one */ - return FAIL; - } - mch_memmove(ccline.cmdbuff, p, (size_t)ccline.cmdlen + 1); - vim_free(p); -+ -+ if (ccline.xpc != NULL -+ && ccline.xpc->xp_pattern != NULL -+ && ccline.xpc->xp_context != EXPAND_NOTHING -+ && ccline.xpc->xp_context != EXPAND_UNSUCCESSFUL) -+ { -+ int i = (int)(ccline.xpc->xp_pattern - p); -+ -+ /* If xp_pattern points inside the old cmdbuff it needs to be adjusted -+ * to point into the newly allocated memory. */ -+ if (i >= 0 && i <= ccline.cmdlen) -+ ccline.xpc->xp_pattern = ccline.cmdbuff + i; -+ } -+ - return OK; - } - - #if defined(FEAT_ARABIC) || defined(PROTO) - static char_u *arshape_buf = NULL; -@@ -2873,10 +2908,11 @@ save_cmdline(ccp) - } - *ccp = prev_ccline; - prev_ccline = ccline; - ccline.cmdbuff = NULL; - ccline.cmdprompt = NULL; -+ ccline.xpc = NULL; - } - - /* - * Restore ccline after it has been saved with save_cmdline(). - */ -@@ -3227,11 +3263,10 @@ nextwild(xp, type, options) - int options; /* extra options for ExpandOne() */ - { - int i, j; - char_u *p1; - char_u *p2; -- int oldlen; - int difflen; - int v; - - if (xp->xp_numfiles == -1) - { -@@ -3252,11 +3287,11 @@ nextwild(xp, type, options) - - MSG_PUTS("..."); /* show that we are busy */ - out_flush(); - - i = (int)(xp->xp_pattern - ccline.cmdbuff); -- oldlen = ccline.cmdpos - i; -+ xp->xp_pattern_len = ccline.cmdpos - i; - - if (type == WILD_NEXT || type == WILD_PREV) - { - /* - * Get next/previous match for a previous expanded pattern. -@@ -3266,22 +3301,24 @@ nextwild(xp, type, options) - else - { - /* - * Translate string into pattern and expand it. - */ -- if ((p1 = addstar(&ccline.cmdbuff[i], oldlen, xp->xp_context)) == NULL) -+ if ((p1 = addstar(xp->xp_pattern, xp->xp_pattern_len, -+ xp->xp_context)) == NULL) - p2 = NULL; - else - { -- p2 = ExpandOne(xp, p1, vim_strnsave(&ccline.cmdbuff[i], oldlen), -+ p2 = ExpandOne(xp, p1, -+ vim_strnsave(&ccline.cmdbuff[i], xp->xp_pattern_len), - WILD_HOME_REPLACE|WILD_ADD_SLASH|WILD_SILENT|WILD_ESCAPE - |options, type); - vim_free(p1); -- /* longest match: make sure it is not shorter (happens with :help */ -+ /* longest match: make sure it is not shorter, happens with :help */ - if (p2 != NULL && type == WILD_LONGEST) - { -- for (j = 0; j < oldlen; ++j) -+ for (j = 0; j < xp->xp_pattern_len; ++j) - if (ccline.cmdbuff[i + j] == '*' - || ccline.cmdbuff[i + j] == '?') - break; - if ((int)STRLEN(p2) < j) - { -@@ -3292,11 +3329,11 @@ nextwild(xp, type, options) - } - } - - if (p2 != NULL && !got_int) - { -- difflen = (int)STRLEN(p2) - oldlen; -+ difflen = (int)STRLEN(p2) - xp->xp_pattern_len; - if (ccline.cmdlen + difflen > ccline.cmdbufflen - 4) - { - v = realloc_cmdbuff(ccline.cmdlen + difflen); - xp->xp_pattern = ccline.cmdbuff + i; - } -@@ -3580,10 +3617,12 @@ ExpandOne(xp, str, orig, options, mode) - */ - void - ExpandInit(xp) - expand_T *xp; - { -+ xp->xp_pattern = NULL; -+ xp->xp_pattern_len = 0; - xp->xp_backslash = XP_BS_NONE; - #ifndef BACKSLASH_IN_FILENAME - xp->xp_shell = FALSE; - #endif - xp->xp_numfiles = -1; -@@ -3789,15 +3828,14 @@ tilde_replace(orig_pat, num_files, files - /* - * Show all matches for completion on the command line. - * Returns EXPAND_NOTHING when the character that triggered expansion should - * be inserted like a normal character. - */ --/*ARGSUSED*/ - static int - showmatches(xp, wildmenu) - expand_T *xp; -- int wildmenu; -+ int wildmenu UNUSED; - { - #define L_SHOWFILE(m) (showtail ? sm_gettail(files_found[m]) : files_found[m]) - int num_files; - char_u **files_found; - int i, j, k; -@@ -3908,12 +3946,30 @@ showmatches(xp, wildmenu) - msg_putchar(' '); - if (xp->xp_context == EXPAND_FILES - || xp->xp_context == EXPAND_SHELLCMD - || xp->xp_context == EXPAND_BUFFERS) - { -- /* highlight directories */ -- j = (mch_isdir(files_found[k])); -+ /* highlight directories */ -+ if (xp->xp_numfiles != -1) -+ { -+ char_u *halved_slash; -+ char_u *exp_path; -+ -+ /* Expansion was done before and special characters -+ * were escaped, need to halve backslashes. Also -+ * $HOME has been replaced with ~/. */ -+ exp_path = expand_env_save_opt(files_found[k], TRUE); -+ halved_slash = backslash_halve_save( -+ exp_path != NULL ? exp_path : files_found[k]); -+ j = mch_isdir(halved_slash != NULL ? halved_slash -+ : files_found[k]); -+ vim_free(exp_path); -+ vim_free(halved_slash); -+ } -+ else -+ /* Expansion was done here, file names are literal. */ -+ j = mch_isdir(files_found[k]); - if (showtail) - p = L_SHOWFILE(k); - else - { - home_replace(NULL, files_found[k], NameBuff, MAXPATHL, -@@ -4272,12 +4328,12 @@ expand_cmdline(xp, str, col, matchcount, - /* Caller can use the character as a normal char instead */ - return EXPAND_NOTHING; - } - - /* add star to file name, or convert to regexp if not exp. files. */ -- file_str = addstar(xp->xp_pattern, -- (int)(str + col - xp->xp_pattern), xp->xp_context); -+ xp->xp_pattern_len = (int)(str + col - xp->xp_pattern); -+ file_str = addstar(xp->xp_pattern, xp->xp_pattern_len, xp->xp_context); - if (file_str == NULL) - return EXPAND_UNSUCCESSFUL; - - /* find all files that match the description */ - if (ExpandFromContext(xp, file_str, matchcount, matches, -@@ -4381,11 +4437,12 @@ ExpandFromContext(xp, pat, num_file, fil - - if (xp->xp_context == EXPAND_FILES) - flags |= EW_FILE; - else - flags = (flags | EW_DIR) & ~EW_FILE; -- ret = expand_wildcards(1, &pat, num_file, file, flags); -+ /* Expand wildcards, supporting %:h and the like. */ -+ ret = expand_wildcards_eval(&pat, num_file, file, flags); - if (free_pat) - vim_free(pat); - return ret; - } - -@@ -4451,10 +4508,11 @@ ExpandFromContext(xp, pat, num_file, fil - char_u *((*func)__ARGS((expand_T *, int))); - int ic; - } tab[] = - { - {EXPAND_COMMANDS, get_command_name, FALSE}, -+ {EXPAND_BEHAVE, get_behave_arg, TRUE}, - #ifdef FEAT_USR_CMDS - {EXPAND_USER_COMMANDS, get_user_commands, FALSE}, - {EXPAND_USER_CMD_FLAGS, get_user_cmd_flags, FALSE}, - {EXPAND_USER_NARGS, get_user_cmd_nargs, FALSE}, - {EXPAND_USER_COMPLETE, get_user_cmd_complete, FALSE}, -@@ -4475,10 +4533,19 @@ ExpandFromContext(xp, pat, num_file, fil - {EXPAND_HIGHLIGHT, get_highlight_name, TRUE}, - #ifdef FEAT_AUTOCMD - {EXPAND_EVENTS, get_event_name, TRUE}, - {EXPAND_AUGROUP, get_augroup_name, TRUE}, - #endif -+#ifdef FEAT_CSCOPE -+ {EXPAND_CSCOPE, get_cscope_name, TRUE}, -+#endif -+#ifdef FEAT_SIGNS -+ {EXPAND_SIGN, get_sign_name, TRUE}, -+#endif -+#ifdef FEAT_PROFILE -+ {EXPAND_PROFILE, get_profile_name, TRUE}, -+#endif - #if (defined(HAVE_LOCALE_H) || defined(X_LOCALE)) \ - && (defined(FEAT_GETTEXT) || defined(FEAT_MBYTE)) - {EXPAND_LANGUAGE, get_lang_arg, TRUE}, - #endif - {EXPAND_ENV_VARS, get_env_name, TRUE}, -@@ -4488,11 +4555,11 @@ ExpandFromContext(xp, pat, num_file, fil - /* - * Find a context in the table and call the ExpandGeneric() with the - * right function to do the expansion. - */ - ret = FAIL; -- for (i = 0; i < sizeof(tab) / sizeof(struct expgen); ++i) -+ for (i = 0; i < (int)(sizeof(tab) / sizeof(struct expgen)); ++i) - if (xp->xp_context == tab[i].context) - { - if (tab[i].ic) - regmatch.rm_ic = TRUE; - ret = ExpandGeneric(xp, ®match, num_file, file, tab[i].func); -@@ -4736,11 +4803,11 @@ call_user_expand_func(user_expand_func, - keep = ccline.cmdbuff[ccline.cmdlen]; - ccline.cmdbuff[ccline.cmdlen] = 0; - sprintf((char *)num, "%d", ccline.cmdpos); - args[1] = ccline.cmdbuff; - } -- args[0] = xp->xp_pattern; -+ args[0] = vim_strnsave(xp->xp_pattern, xp->xp_pattern_len); - args[2] = num; - - /* Save the cmdline, we don't know what the function may do. */ - save_ccline = ccline; - ccline.cmdbuff = NULL; -@@ -4752,10 +4819,11 @@ call_user_expand_func(user_expand_func, - ccline = save_ccline; - current_SID = save_current_SID; - if (ccline.cmdbuff != NULL) - ccline.cmdbuff[ccline.cmdlen] = keep; - -+ vim_free(args[0]); - return ret; - } - - /* - * Expand names with a function defined by the user. -@@ -4829,18 +4897,18 @@ ExpandUserList(xp, num_file, file) - - ga_init2(&ga, (int)sizeof(char *), 3); - /* Loop over the items in the list. */ - for (li = retlist->lv_first; li != NULL; li = li->li_next) - { -- if (li->li_tv.v_type != VAR_STRING) -- continue; /* Skip non-string items */ -+ if (li->li_tv.v_type != VAR_STRING || li->li_tv.vval.v_string == NULL) -+ continue; /* Skip non-string items and empty strings */ - - if (ga_grow(&ga, 1) == FAIL) - break; - - ((char_u **)ga.ga_data)[ga.ga_len] = -- vim_strsave(li->li_tv.vval.v_string); -+ vim_strsave(li->li_tv.vval.v_string); - ++ga.ga_len; - } - list_unref(retlist); - - *file = ga.ga_data; -@@ -4869,11 +4937,11 @@ ExpandRTDir(pat, num_file, file, dirname - *file = NULL; - s = alloc((unsigned)(STRLEN(pat) + STRLEN(dirname) + 7)); - if (s == NULL) - return FAIL; - sprintf((char *)s, "%s/%s*.vim", dirname, pat); -- all = globpath(p_rtp, s); -+ all = globpath(p_rtp, s, 0); - vim_free(s); - if (all == NULL) - return FAIL; - - ga_init2(&ga, (int)sizeof(char *), 3); -@@ -4910,13 +4978,14 @@ ExpandRTDir(pat, num_file, file, dirname - * Expand "file" for all comma-separated directories in "path". - * Returns an allocated string with all matches concatenated, separated by - * newlines. Returns NULL for an error or no matches. - */ - char_u * --globpath(path, file) -+globpath(path, file, expand_options) - char_u *path; - char_u *file; -+ int expand_options; - { - expand_T xpc; - char_u *buf; - garray_T ga; - int i; -@@ -4941,14 +5010,14 @@ globpath(path, file) - copy_option_part(&path, buf, MAXPATHL, ","); - if (STRLEN(buf) + STRLEN(file) + 2 < MAXPATHL) - { - add_pathsep(buf); - STRCAT(buf, file); -- if (ExpandFromContext(&xpc, buf, &num_p, &p, WILD_SILENT) != FAIL -- && num_p > 0) -+ if (ExpandFromContext(&xpc, buf, &num_p, &p, -+ WILD_SILENT|expand_options) != FAIL && num_p > 0) - { -- ExpandEscape(&xpc, buf, num_p, p, WILD_SILENT); -+ ExpandEscape(&xpc, buf, num_p, p, WILD_SILENT|expand_options); - for (len = 0, i = 0; i < num_p; ++i) - len += (int)STRLEN(p[i]) + 1; - - /* Concatenate new results to previous ones. */ - if (ga_grow(&ga, len) == OK) -@@ -5639,11 +5708,11 @@ ex_history(eap) - i = *end; - *end = NUL; - histype1 = get_histtype(arg); - if (histype1 == -1) - { -- if (STRICMP(arg, "all") == 0) -+ if (STRNICMP(arg, "all", STRLEN(arg)) == 0) - { - histype1 = 0; - histype2 = HIST_COUNT-1; - } - else -@@ -6018,20 +6087,21 @@ ex_window() - # ifdef FEAT_AUTOCMD - unblock_autocmds(); - # endif - return K_IGNORE; - } -- cmdwin_type = ccline.cmdfirstc; -- if (cmdwin_type == NUL) -- cmdwin_type = '-'; -+ cmdwin_type = get_cmdline_type(); - - /* Create the command-line buffer empty. */ -- (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE); -+ (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, NULL); - (void)setfname(curbuf, (char_u *)"[Command Line]", NULL, TRUE); - set_option_value((char_u *)"bt", 0L, (char_u *)"nofile", OPT_LOCAL); - set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL); - curbuf->b_p_ma = TRUE; -+#ifdef FEAT_FOLDING -+ curwin->w_p_fen = FALSE; -+#endif - # ifdef FEAT_RIGHTLEFT - curwin->w_p_rl = cmdmsg_rl; - cmdmsg_rl = FALSE; - # endif - # ifdef FEAT_SCROLLBIND -@@ -6044,11 +6114,11 @@ ex_window() - # endif - - /* Showing the prompt may have set need_wait_return, reset it. */ - need_wait_return = FALSE; - -- histtype = hist_char2type(ccline.cmdfirstc); -+ histtype = hist_char2type(cmdwin_type); - if (histtype == HIST_CMD || histtype == HIST_DEBUG) - { - if (p_wc == TAB) - { - add_map((char_u *)"<buffer> <Tab> <C-X><C-V>", INSERT); -@@ -6198,11 +6268,15 @@ ex_window() - # endif - wp = curwin; - bp = curbuf; - win_goto(old_curwin); - win_close(wp, TRUE); -- close_buffer(NULL, bp, DOBUF_WIPE); -+ -+ /* win_close() may have already wiped the buffer when 'bh' is -+ * set to 'wipe' */ -+ if (buf_valid(bp)) -+ close_buffer(NULL, bp, DOBUF_WIPE); - - /* Restore window sizes. */ - win_size_restore(&winsizes); - - # ifdef FEAT_AUTOCMD ---- vim72.orig/src/farsi.c -+++ vim72/src/farsi.c -@@ -101,11 +101,12 @@ toF_Xor_X_(c) - case IE_: - return _IE; - case F_HE: - tempc = _HE; - -- if (p_ri && (curwin->w_cursor.col+1 < STRLEN(ml_get_curline()))) -+ if (p_ri && (curwin->w_cursor.col + 1 -+ < (colnr_T)STRLEN(ml_get_curline()))) - { - inc_cursor(); - - if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) - tempc = _HE_; -@@ -342,11 +343,11 @@ put_curr_and_l_to_X(c) - int tempc; - - if (curwin->w_p_rl && p_ri) - return; - -- if ( (curwin->w_cursor.col < STRLEN(ml_get_curline()))) -+ if ((curwin->w_cursor.col < (colnr_T)STRLEN(ml_get_curline()))) - { - if ((p_ri && curwin->w_cursor.col) || !p_ri) - { - if (p_ri) - dec_cursor(); -@@ -563,11 +564,11 @@ chg_c_to_X_or_X () - { - int tempc; - - tempc = gchar_cursor(); - -- if (curwin->w_cursor.col+1 < STRLEN(ml_get_curline())) -+ if (curwin->w_cursor.col + 1 < (colnr_T)STRLEN(ml_get_curline())) - { - inc_cursor(); - - if ((tempc == F_HE) && (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))) - { -@@ -592,12 +593,12 @@ chg_c_to_X_or_X () - static void - chg_l_to_X_orX_ () - { - int tempc; - -- if (!curwin->w_cursor.col && -- (curwin->w_cursor.col+1 == STRLEN(ml_get_curline()))) -+ if (curwin->w_cursor.col != 0 && -+ (curwin->w_cursor.col + 1 == (colnr_T)STRLEN(ml_get_curline()))) - return; - - if (!curwin->w_cursor.col && p_ri) - return; - -@@ -661,12 +662,12 @@ chg_l_to_X_orX_ () - static void - chg_l_toXor_X () - { - int tempc; - -- if (!curwin->w_cursor.col && -- (curwin->w_cursor.col+1 == STRLEN(ml_get_curline()))) -+ if (curwin->w_cursor.col != 0 && -+ (curwin->w_cursor.col + 1 == (colnr_T)STRLEN(ml_get_curline()))) - return; - - if (!curwin->w_cursor.col && p_ri) - return; - ---- vim72.orig/src/feature.h -+++ vim72/src/feature.h -@@ -765,13 +765,17 @@ - # define FEAT_GUI_TABLINE - #endif - - /* - * +browse ":browse" command. -+ * or just the ":browse" command modifier - */ --#if defined(FEAT_NORMAL) && (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC)) --# define FEAT_BROWSE -+#if defined(FEAT_NORMAL) -+# define FEAT_BROWSE_CMD -+# if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC) -+# define FEAT_BROWSE -+# endif - #endif - - /* - * +dialog_gui Use GUI dialog. - * +dialog_con May use Console dialog. -@@ -838,14 +842,18 @@ - * DEBUG Output a lot of debugging garbage. - */ - /* #define DEBUG */ - - /* -- * STARTUPTIME Time the startup process. Writes a "vimstartup" file -- * with timestamps. -+ * STARTUPTIME Time the startup process. Writes a file with -+ * timestamps. - */ --/* #define STARTUPTIME "vimstartup" */ -+#if defined(FEAT_NORMAL) \ -+ && ((defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)) \ -+ || defined(WIN3264)) -+# define STARTUPTIME 1 -+#endif - - /* - * MEM_PROFILE Debugging of memory allocation and freeing. - */ - /* #define MEM_PROFILE */ ---- vim72.orig/src/fileio.c -+++ vim72/src/fileio.c -@@ -19,11 +19,11 @@ - # include "vimio.h" /* for mktemp(), CJW 1997-12-03 */ - #endif - - #include "vim.h" - --#ifdef __TANDEM -+#if defined(__TANDEM) || defined(__MINT__) - # include <limits.h> /* for SSIZE_MAX */ - #endif - - #if defined(HAVE_UTIME) && defined(HAVE_UTIME_H) - # include <utime.h> /* for struct utimbuf */ -@@ -67,11 +67,11 @@ static int time_differs __ARGS((long t1, - #ifdef FEAT_AUTOCMD - static int apply_autocmds_exarg __ARGS((event_T event, char_u *fname, char_u *fname_io, int force, buf_T *buf, exarg_T *eap)); - static int au_find_group __ARGS((char_u *name)); - - # define AUGROUP_DEFAULT -1 /* default autocmd group */ --# define AUGROUP_ERROR -2 /* errornouse autocmd group */ -+# define AUGROUP_ERROR -2 /* erroneous autocmd group */ - # define AUGROUP_ALL -3 /* all autocmd groups */ - #endif - - #if defined(FEAT_CRYPT) || defined(FEAT_MBYTE) - # define HAS_BW_FLAGS -@@ -119,10 +119,12 @@ struct bw_info - int bw_restlen; /* nr of bytes in bw_rest[] */ - int bw_first; /* first write call */ - char_u *bw_conv_buf; /* buffer for writing converted chars */ - int bw_conv_buflen; /* size of bw_conv_buf */ - int bw_conv_error; /* set for conversion error */ -+ linenr_T bw_conv_error_lnum; /* first line with error or zero */ -+ linenr_T bw_start_lnum; /* line number at start of buffer */ - # ifdef USE_ICONV - iconv_t bw_iconv_fd; /* descriptor for iconv() or -1 */ - # endif - #endif - }; -@@ -130,11 +132,11 @@ struct bw_info - static int buf_write_bytes __ARGS((struct bw_info *ip)); - - #ifdef FEAT_MBYTE - static linenr_T readfile_linenr __ARGS((linenr_T linecnt, char_u *p, char_u *endp)); - static int ucs2bytes __ARGS((unsigned c, char_u **pp, int flags)); --static int same_encoding __ARGS((char_u *a, char_u *b)); -+static int need_conversion __ARGS((char_u *fenc)); - static int get_fio_flags __ARGS((char_u *ptr)); - static char_u *check_for_bom __ARGS((char_u *p, long size, int *lenp, int flags)); - static int make_bom __ARGS((char_u *buf, char_u *name)); - # ifdef WIN3264 - static int get_win_fio_flags __ARGS((char_u *ptr)); -@@ -142,11 +144,16 @@ static int get_win_fio_flags __ARGS((cha - # ifdef MACOS_X - static int get_mac_fio_flags __ARGS((char_u *ptr)); - # endif - #endif - static int move_lines __ARGS((buf_T *frombuf, buf_T *tobuf)); -- -+#ifdef TEMPDIRNAMES -+static void vim_settempdir __ARGS((char_u *tempdir)); -+#endif -+#ifdef FEAT_AUTOCMD -+static char *e_auchangedbuf = N_("E812: Autocommands changed buffer or buffer name"); -+#endif - - void - filemess(buf, name, s, attr) - buf_T *buf; - char_u *name; -@@ -293,10 +300,23 @@ readfile(fname, sfname, from, lines_to_s - wasn't possible */ - char_u conv_rest[CONV_RESTLEN]; - int conv_restlen = 0; /* nr of bytes in conv_rest[] */ - #endif - -+#ifdef FEAT_AUTOCMD -+ /* Remember the initial values of curbuf, curbuf->b_ffname and -+ * curbuf->b_fname to detect whether they are altered as a result of -+ * executing nasty autocommands. Also check if "fname" and "sfname" -+ * point to one of these values. */ -+ buf_T *old_curbuf = curbuf; -+ char_u *old_b_ffname = curbuf->b_ffname; -+ char_u *old_b_fname = curbuf->b_fname; -+ int using_b_ffname = (fname == curbuf->b_ffname) -+ || (sfname == curbuf->b_ffname); -+ int using_b_fname = (fname == curbuf->b_fname) -+ || (sfname == curbuf->b_fname); -+#endif - write_no_eol_lnum = 0; /* in case it was set by the previous read */ - - /* - * If there is no file name yet, use the one for the read file. - * BF_NOTEDITED is set to reflect this. -@@ -587,11 +607,25 @@ readfile(fname, sfname, from, lines_to_s - * that we are editing this file. Don't do this for a - * "nofile" or "nowrite" buffer type. */ - #ifdef FEAT_QUICKFIX - if (!bt_dontwrite(curbuf)) - #endif -+ { - check_need_swap(newfile); -+#ifdef FEAT_AUTOCMD -+ /* SwapExists autocommand may mess things up */ -+ if (curbuf != old_curbuf -+ || (using_b_ffname -+ && (old_b_ffname != curbuf->b_ffname)) -+ || (using_b_fname -+ && (old_b_fname != curbuf->b_fname))) -+ { -+ EMSG(_(e_auchangedbuf)); -+ return FAIL; -+ } -+#endif -+ } - if (dir_of_file_exists(fname)) - filemess(curbuf, sfname, (char_u *)_("[New File]"), 0); - else - filemess(curbuf, sfname, - (char_u *)_("[New DIRECTORY]"), 0); -@@ -666,13 +700,25 @@ readfile(fname, sfname, from, lines_to_s - #ifdef FEAT_QUICKFIX - if (!bt_dontwrite(curbuf)) - #endif - { - check_need_swap(newfile); -+#ifdef FEAT_AUTOCMD -+ if (!read_stdin && (curbuf != old_curbuf -+ || (using_b_ffname && (old_b_ffname != curbuf->b_ffname)) -+ || (using_b_fname && (old_b_fname != curbuf->b_fname)))) -+ { -+ EMSG(_(e_auchangedbuf)); -+ if (!read_buffer) -+ close(fd); -+ return FAIL; -+ } -+#endif - #ifdef UNIX - /* Set swap file protection bits after creating it. */ -- if (swap_mode > 0 && curbuf->b_ml.ml_mfp->mf_fname != NULL) -+ if (swap_mode > 0 && curbuf->b_ml.ml_mfp != NULL -+ && curbuf->b_ml.ml_mfp->mf_fname != NULL) - (void)mch_setperm(curbuf->b_ml.ml_mfp->mf_fname, (long)swap_mode); - #endif - } - - #if defined(HAS_SWAP_EXISTS_ACTION) -@@ -696,11 +742,10 @@ readfile(fname, sfname, from, lines_to_s - #ifdef FEAT_AUTOCMD - if (!read_buffer) - { - int m = msg_scroll; - int n = msg_scrolled; -- buf_T *old_curbuf = curbuf; - - /* - * The file must be closed again, the autocommands may want to change - * the file before reading it. - */ -@@ -738,12 +783,17 @@ readfile(fname, sfname, from, lines_to_s - } - #endif - /* - * Don't allow the autocommands to change the current buffer. - * Try to re-open the file. -+ * -+ * Don't allow the autocommands to change the buffer name either -+ * (cd for example) if it invalidates fname or sfname. - */ - if (!read_stdin && (curbuf != old_curbuf -+ || (using_b_ffname && (old_b_ffname != curbuf->b_ffname)) -+ || (using_b_fname && (old_b_fname != curbuf->b_fname)) - || (fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0)) < 0)) - { - --no_wait_return; - msg_scroll = msg_save; - if (fd < 0) -@@ -930,11 +980,14 @@ retry: - if (keep_fileformat) - keep_fileformat = FALSE; - else - { - if (eap != NULL && eap->force_ff != 0) -+ { - fileformat = get_fileformat_force(curbuf, eap); -+ try_unix = try_dos = try_mac = FALSE; -+ } - else if (curbuf->b_p_bin) - fileformat = EOL_UNIX; /* binary: use Unix format */ - else if (*p_ffs == NUL) - fileformat = get_fileformat(curbuf);/* use format from buffer */ - else -@@ -991,17 +1044,16 @@ retry: - tmpname = NULL; - } - } - - /* -- * Conversion is required when the encoding of the file is different -- * from 'encoding' or 'encoding' is UTF-16, UCS-2 or UCS-4 (requires -- * conversion to UTF-8). -+ * Conversion may be required when the encoding of the file is different -+ * from 'encoding' or 'encoding' is UTF-16, UCS-2 or UCS-4. - */ - fio_flags = 0; -- converted = (*fenc != NUL && !same_encoding(p_enc, fenc)); -- if (converted || enc_unicode != 0) -+ converted = need_conversion(fenc); -+ if (converted) - { - - /* "ucs-bom" means we need to check the first bytes of the file - * for a BOM. */ - if (STRCMP(fenc, ENC_UCSBOM) == 0) -@@ -2202,18 +2254,26 @@ failed: - # endif - #endif - - if (!read_buffer && !read_stdin) - close(fd); /* errors are ignored */ -+#ifdef HAVE_FD_CLOEXEC -+ else -+ { -+ int fdflags = fcntl(fd, F_GETFD); -+ if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0) -+ fcntl(fd, F_SETFD, fdflags | FD_CLOEXEC); -+ } -+#endif - vim_free(buffer); - - #ifdef HAVE_DUP - if (read_stdin) - { - /* Use stderr for stdin, makes shell commands work. */ - close(0); -- dup(2); -+ ignored = dup(2); - } - #endif - - #ifdef FEAT_MBYTE - if (tmpname != NULL) -@@ -2339,15 +2399,10 @@ failed: - if (ff_error == EOL_DOS) - { - STRCAT(IObuff, _("[CR missing]")); - c = TRUE; - } -- if (ff_error == EOL_MAC) -- { -- STRCAT(IObuff, _("[NL found]")); -- c = TRUE; -- } - if (split) - { - STRCAT(IObuff, _("[long lines split]")); - c = TRUE; - } -@@ -2709,11 +2764,11 @@ readfile_charconvert(fname, fenc, fdp) - static void - check_marks_read() - { - if (!curbuf->b_marks_read && get_viminfo_parameter('\'') > 0 - && curbuf->b_ffname != NULL) -- read_viminfo(NULL, FALSE, TRUE, FALSE); -+ read_viminfo(NULL, VIF_WANT_MARKS); - - /* Always set b_marks_read; needed when 'viminfo' is changed to include - * the ' parameter after opening a buffer. */ - curbuf->b_marks_read = TRUE; - } -@@ -2879,10 +2934,11 @@ buf_write(buf, fname, sfname, start, end - char_u c; - int len; - linenr_T lnum; - long nchars; - char_u *errmsg = NULL; -+ int errmsg_allocated = FALSE; - char_u *errnum = NULL; - char_u *buffer; - char_u smallbuf[SMBUFSIZE]; - char_u *backup_ext; - int bufsize; -@@ -2923,10 +2979,17 @@ buf_write(buf, fname, sfname, start, end - backup or new file */ - #endif - - if (fname == NULL || *fname == NUL) /* safety check */ - return FAIL; -+ if (buf->b_ml.ml_mfp == NULL) -+ { -+ /* This can happen during startup when there is a stray "w" in the -+ * vimrc file. */ -+ EMSG(_(e_emptybuf)); -+ return FAIL; -+ } - - /* - * Disallow writing from .exrc and .vimrc in current directory for - * security reasons. - */ -@@ -2942,10 +3005,11 @@ buf_write(buf, fname, sfname, start, end - - #ifdef FEAT_MBYTE - /* must init bw_conv_buf and bw_iconv_fd before jumping to "fail" */ - write_info.bw_conv_buf = NULL; - write_info.bw_conv_error = FALSE; -+ write_info.bw_conv_error_lnum = 0; - write_info.bw_restlen = 0; - # ifdef USE_ICONV - write_info.bw_iconv_fd = (iconv_t)-1; - # endif - #endif -@@ -3449,16 +3513,16 @@ buf_write(buf, fname, sfname, start, end - backup_copy = TRUE; - else - { - # ifdef UNIX - # ifdef HAVE_FCHOWN -- fchown(fd, st_old.st_uid, st_old.st_gid); -+ ignored = fchown(fd, st_old.st_uid, st_old.st_gid); - # endif - if (mch_stat((char *)IObuff, &st) < 0 - || st.st_uid != st_old.st_uid - || st.st_gid != st_old.st_gid -- || st.st_mode != perm) -+ || (long)st.st_mode != perm) - backup_copy = TRUE; - # endif - /* Close the file before removing it, on MS-Windows we - * can't delete an open file. */ - close(fd); -@@ -3920,14 +3984,13 @@ buf_write(buf, fname, sfname, start, end - } - else - fenc = buf->b_p_fenc; - - /* -- * The file needs to be converted when 'fileencoding' is set and -- * 'fileencoding' differs from 'encoding'. -+ * Check if the file needs to be converted. - */ -- converted = (*fenc != NUL && !same_encoding(p_enc, fenc)); -+ converted = need_conversion(fenc); - - /* - * Check if UTF-8 to UCS-2/4 or Latin1 conversion needs to be done. Or - * Latin1 to Unicode conversion. This is handled in buf_write_bytes(). - * Prepare the flags for it and allocate bw_conv_buf when needed. -@@ -4198,10 +4261,11 @@ restore_backup: - end = 0; - else - nchars += write_info.bw_len; - } - } -+ write_info.bw_start_lnum = start; - #endif - - write_info.bw_len = bufsize; - #ifdef HAS_BW_FLAGS - write_info.bw_flags = wb_flags; -@@ -4233,10 +4297,13 @@ restore_backup: - break; - } - nchars += bufsize; - s = buffer; - len = 0; -+#ifdef FEAT_MBYTE -+ write_info.bw_start_lnum = lnum; -+#endif - } - /* write failed or last line has no EOL: stop here */ - if (end == 0 - || (lnum == end - && write_bin -@@ -4365,18 +4432,18 @@ restore_backup: - * permission or ACL stuff */ - if (mch_stat((char *)wfname, &st) < 0 - || st.st_uid != st_old.st_uid - || st.st_gid != st_old.st_gid) - { -- fchown(fd, st_old.st_uid, st_old.st_gid); -+ ignored = fchown(fd, st_old.st_uid, st_old.st_gid); - if (perm >= 0) /* set permission again, may have changed */ - (void)mch_setperm(wfname, perm); - } - # endif - buf_setino(buf); - } -- else if (buf->b_dev < 0) -+ else if (!buf->b_dev_valid) - /* Set the inode when creating a new file. */ - buf_setino(buf); - #endif - - if (close(fd) != 0) -@@ -4429,11 +4496,21 @@ restore_backup: - { - if (errmsg == NULL) - { - #ifdef FEAT_MBYTE - if (write_info.bw_conv_error) -- errmsg = (char_u *)_("E513: write error, conversion failed (make 'fenc' empty to override)"); -+ { -+ if (write_info.bw_conv_error_lnum == 0) -+ errmsg = (char_u *)_("E513: write error, conversion failed (make 'fenc' empty to override)"); -+ else -+ { -+ errmsg_allocated = TRUE; -+ errmsg = alloc(300); -+ vim_snprintf((char *)errmsg, 300, _("E513: write error, conversion failed in line %ld (make 'fenc' empty to override)"), -+ (long)write_info.bw_conv_error_lnum); -+ } -+ } - else - #endif - if (got_int) - errmsg = (char_u *)_(e_interr); - else -@@ -4505,10 +4582,16 @@ restore_backup: - #ifdef FEAT_MBYTE - if (write_info.bw_conv_error) - { - STRCAT(IObuff, _(" CONVERSION ERROR")); - c = TRUE; -+ if (write_info.bw_conv_error_lnum != 0) -+ { -+ size_t l = STRLEN(IObuff); -+ vim_snprintf((char *)IObuff + l, IOSIZE - l, _(" in line %ld;"), -+ (long)write_info.bw_conv_error_lnum); -+ } - } - else if (notconverted) - { - STRCAT(IObuff, _("[NOT converted]")); - c = TRUE; -@@ -4701,10 +4784,12 @@ nofail: - STRMOVE(IObuff + numlen, IObuff); - mch_memmove(IObuff, errnum, (size_t)numlen); - } - STRCAT(IObuff, errmsg); - emsg(IObuff); -+ if (errmsg_allocated) -+ vim_free(errmsg); - - retval = FAIL; - if (end == 0) - { - MSG_PUTS_ATTR(_("\nWARNING: Original file may be lost or damaged\n"), -@@ -4780,18 +4865,26 @@ nofail: - set_rw_fname(fname, sfname) - char_u *fname; - char_u *sfname; - { - #ifdef FEAT_AUTOCMD -+ buf_T *buf = curbuf; -+ - /* It's like the unnamed buffer is deleted.... */ - if (curbuf->b_p_bl) - apply_autocmds(EVENT_BUFDELETE, NULL, NULL, FALSE, curbuf); - apply_autocmds(EVENT_BUFWIPEOUT, NULL, NULL, FALSE, curbuf); - # ifdef FEAT_EVAL - if (aborting()) /* autocmds may abort script processing */ - return FAIL; - # endif -+ if (curbuf != buf) -+ { -+ /* We are in another buffer now, don't do the renaming. */ -+ EMSG(_(e_auchangedbuf)); -+ return FAIL; -+ } - #endif - - if (setfname(curbuf, fname, sfname, FALSE) == OK) - curbuf->b_flags |= BF_NOTEDITED; - -@@ -5052,11 +5145,17 @@ buf_write_bytes(ip) - c = utf_ptr2char(buf + wlen); - else - c = buf[wlen]; - } - -- ip->bw_conv_error |= ucs2bytes(c, &p, flags); -+ if (ucs2bytes(c, &p, flags) && !ip->bw_conv_error) -+ { -+ ip->bw_conv_error = TRUE; -+ ip->bw_conv_error_lnum = ip->bw_start_lnum; -+ } -+ if (c == NL) -+ ++ip->bw_start_lnum; - } - if (flags & FIO_LATIN1) - len = (int)(p - buf); - else - { -@@ -5244,17 +5343,20 @@ buf_write_bytes(ip) - size_t tolen; - - /* Convert with iconv(). */ - if (ip->bw_restlen > 0) - { -+ char *fp; -+ - /* Need to concatenate the remainder of the previous call and - * the bytes of the current call. Use the end of the - * conversion buffer for this. */ - fromlen = len + ip->bw_restlen; -- from = (char *)ip->bw_conv_buf + ip->bw_conv_buflen - fromlen; -- mch_memmove((void *)from, ip->bw_rest, (size_t)ip->bw_restlen); -- mch_memmove((void *)(from + ip->bw_restlen), buf, (size_t)len); -+ fp = (char *)ip->bw_conv_buf + ip->bw_conv_buflen - fromlen; -+ mch_memmove(fp, ip->bw_rest, (size_t)ip->bw_restlen); -+ mch_memmove(fp + ip->bw_restlen, buf, (size_t)len); -+ from = fp; - tolen = ip->bw_conv_buflen - fromlen; - } - else - { - from = (const char *)buf; -@@ -5330,10 +5432,11 @@ buf_write_bytes(ip) - } - - #ifdef FEAT_MBYTE - /* - * Convert a Unicode character to bytes. -+ * Return TRUE for an error, FALSE when it's OK. - */ - static int - ucs2bytes(c, pp, flags) - unsigned c; /* in: character */ - char_u **pp; /* in/out: pointer to result */ -@@ -5413,24 +5516,41 @@ ucs2bytes(c, pp, flags) - *pp = p; - return error; - } - - /* -- * Return TRUE if "a" and "b" are the same 'encoding'. -- * Ignores difference between "ansi" and "latin1", "ucs-4" and "ucs-4be", etc. -+ * Return TRUE if file encoding "fenc" requires conversion from or to -+ * 'encoding'. - */ - static int --same_encoding(a, b) -- char_u *a; -- char_u *b; -+need_conversion(fenc) -+ char_u *fenc; - { -- int f; -+ int same_encoding; -+ int enc_flags; -+ int fenc_flags; - -- if (STRCMP(a, b) == 0) -- return TRUE; -- f = get_fio_flags(a); -- return (f != 0 && get_fio_flags(b) == f); -+ if (*fenc == NUL || STRCMP(p_enc, fenc) == 0) -+ same_encoding = TRUE; -+ else -+ { -+ /* Ignore difference between "ansi" and "latin1", "ucs-4" and -+ * "ucs-4be", etc. */ -+ enc_flags = get_fio_flags(p_enc); -+ fenc_flags = get_fio_flags(fenc); -+ same_encoding = (enc_flags != 0 && fenc_flags == enc_flags); -+ } -+ if (same_encoding) -+ { -+ /* Specified encoding matches with 'encoding'. This requires -+ * conversion when 'encoding' is Unicode but not UTF-8. */ -+ return enc_unicode != 0; -+ } -+ -+ /* Encodings differ. However, conversion is not needed when 'enc' is any -+ * Unicode encoding and the file is UTF-8. */ -+ return !(enc_utf8 && fenc_flags == FIO_UTF8); - } - - /* - * Check "ptr" for a unicode encoding and return the FIO_ flags needed for the - * internal conversion. -@@ -5548,13 +5668,14 @@ check_for_bom(p, size, lenp, flags) - && (flags == FIO_ALL || flags == (FIO_UCS4 | FIO_ENDIAN_L))) - { - name = "ucs-4le"; /* FF FE 00 00 */ - len = 4; - } -- else if (flags == FIO_ALL || flags == (FIO_UCS2 | FIO_ENDIAN_L)) -+ else if (flags == (FIO_UCS2 | FIO_ENDIAN_L)) - name = "ucs-2le"; /* FF FE */ -- else if (flags == (FIO_UTF16 | FIO_ENDIAN_L)) -+ else if (flags == FIO_ALL || flags == (FIO_UTF16 | FIO_ENDIAN_L)) -+ /* utf-16le is preferred, it also works for ucs-2le text */ - name = "utf-16le"; /* FF FE */ - } - else if (p[0] == 0xfe && p[1] == 0xff - && (flags == FIO_ALL || flags == FIO_UCS2 || flags == FIO_UTF16)) - { -@@ -5915,11 +6036,11 @@ buf_modname(shortname, fname, ext, prepe - else if (*ext == '/' || *ext == '_') - #else - else if (*ext == '.') - #endif - { -- if (s - ptr > (size_t)8) -+ if ((size_t)(s - ptr) > (size_t)8) - { - s = ptr + 8; - *s = '\0'; - } - } -@@ -6029,13 +6150,13 @@ vim_fgets(buf, size, fp) - /* Now throw away the rest of the line: */ - do - { - tbuf[FGETS_SIZE - 2] = NUL; - #ifdef USE_CR -- fgets_cr((char *)tbuf, FGETS_SIZE, fp); -+ ignoredp = fgets_cr((char *)tbuf, FGETS_SIZE, fp); - #else -- fgets((char *)tbuf, FGETS_SIZE, fp); -+ ignoredp = fgets((char *)tbuf, FGETS_SIZE, fp); - #endif - } while (tbuf[FGETS_SIZE - 2] != NUL && tbuf[FGETS_SIZE - 2] != '\n'); - } - return (eof == NULL); - } -@@ -6105,23 +6226,84 @@ vim_rename(from, to) - struct stat st; - long perm; - #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 the names are identical, there is nothing to do. When they refer -+ * to the same file (ignoring case and slash/backslash differences) but -+ * the file name differs we need to go through a temp file. - */ - if (fnamecmp(from, to) == 0) -- return 0; -+ { -+#ifdef CASE_INSENSITIVE_FILENAME -+ if (STRCMP(gettail(from), gettail(to)) != 0) -+ use_tmp_file = TRUE; -+ else -+#endif -+ return 0; -+ } - - /* - * Fail if the "from" file doesn't exist. Avoids that "to" is deleted. - */ - if (mch_stat((char *)from, &st) < 0) - return -1; - -+#ifdef UNIX -+ { -+ struct stat st_to; -+ -+ /* It's possible for the source and destination to be the same file. -+ * This happens when "from" and "to" differ in case and are on a FAT32 -+ * filesystem. In that case go through a temp file name. */ -+ if (mch_stat((char *)to, &st_to) >= 0 -+ && st.st_dev == st_to.st_dev -+ && st.st_ino == st_to.st_ino) -+ use_tmp_file = TRUE; -+ } -+#endif -+ -+#if defined(UNIX) || defined(CASE_INSENSITIVE_FILENAME) -+ if (use_tmp_file) -+ { -+ char tempname[MAXPATHL + 1]; -+ -+ /* -+ * Find a name that doesn't exist and is in the same directory. -+ * Rename "from" to "tempname" and then rename "tempname" to "to". -+ */ -+ if (STRLEN(from) >= MAXPATHL - 5) -+ return -1; -+ STRCPY(tempname, from); -+ for (n = 123; n < 99999; ++n) -+ { -+ sprintf((char *)gettail((char_u *)tempname), "%d", n); -+ if (mch_stat(tempname, &st) < 0) -+ { -+ if (mch_rename((char *)from, tempname) == 0) -+ { -+ if (mch_rename(tempname, (char *)to) == 0) -+ return 0; -+ /* Strange, the second step failed. Try moving the -+ * file back and return failure. */ -+ mch_rename(tempname, (char *)from); -+ return -1; -+ } -+ /* If it fails for one temp name it will most likely fail -+ * for any temp name, give up. */ -+ return -1; -+ } -+ } -+ return -1; -+ } -+#endif -+ - /* - * Delete the "to" file, this is required on some systems to make the - * mch_rename() work, on other systems it makes sure that we don't have - * two files when the mch_rename() fails. - */ -@@ -6258,11 +6440,11 @@ check_timestamps(focus) - return FALSE; - } - - if (!stuff_empty() || global_busy || !typebuf_typed() - #ifdef FEAT_AUTOCMD -- || autocmd_busy || curbuf_lock > 0 -+ || autocmd_busy || curbuf_lock > 0 || allbuf_lock > 0 - #endif - ) - need_check_timestamps = TRUE; /* check later */ - else - { -@@ -6351,15 +6533,14 @@ move_lines(frombuf, tobuf) - * Also check if the file for a new buffer unexpectedly appeared. - * return 1 if a changed buffer was found. - * return 2 if a message has been displayed. - * return 0 otherwise. - */ --/*ARGSUSED*/ - int - buf_check_timestamp(buf, focus) - buf_T *buf; -- int focus; /* called for GUI focus event */ -+ int focus UNUSED; /* called for GUI focus event */ - { - struct stat st; - int stat_res; - int retval = 0; - char_u *path; -@@ -6460,12 +6641,14 @@ buf_check_timestamp(buf, focus) - busy = TRUE; - # ifdef FEAT_EVAL - set_vim_var_string(VV_FCS_REASON, (char_u *)reason, -1); - set_vim_var_string(VV_FCS_CHOICE, (char_u *)"", -1); - # endif -+ ++allbuf_lock; - n = apply_autocmds(EVENT_FILECHANGEDSHELL, - buf->b_fname, buf->b_fname, FALSE, buf); -+ --allbuf_lock; - busy = FALSE; - if (n) - { - if (!buf_valid(buf)) - EMSG(_("E246: FileChangedShell autocommand deleted buffer")); -@@ -6509,11 +6692,14 @@ buf_check_timestamp(buf, focus) - else if (*reason == 'm') - { - mesg = _("W16: Warning: Mode of file \"%s\" has changed since editing started"); - mesg2 = _("See \":help W16\" for more info."); - } -- /* Else: only timestamp changed, ignored */ -+ else -+ /* Only timestamp changed, store it to avoid a warning -+ * in check_mtime() later. */ -+ buf->b_mtime_read = buf->b_mtime; - } - } - } - - } -@@ -6536,10 +6722,15 @@ buf_check_timestamp(buf, focus) - if (!helpmesg) - mesg2 = ""; - tbuf = alloc((unsigned)(STRLEN(path) + STRLEN(mesg) - + STRLEN(mesg2) + 2)); - sprintf((char *)tbuf, mesg, path); -+#ifdef FEAT_EVAL -+ /* Set warningmsg here, before the unimportant and output-specific -+ * mesg2 has been appended. */ -+ set_vim_var_string(VV_WARNINGMSG, tbuf, -1); -+#endif - #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG) - if (can_reload) - { - if (*mesg2 != NUL) - { -@@ -6730,14 +6921,15 @@ buf_reload(buf, orig_mode) - #ifdef FEAT_AUTOCMD - keep_filetype = FALSE; - #endif - #ifdef FEAT_FOLDING - { -- win_T *wp; -+ win_T *wp; -+ tabpage_T *tp; - - /* Update folds unless they are defined manually. */ -- FOR_ALL_WINDOWS(wp) -+ FOR_ALL_TAB_WINDOWS(tp, wp) - if (wp->w_buffer == curwin->w_buffer - && !foldmethodIsManual(wp)) - foldUpdateAll(wp); - } - #endif -@@ -6751,16 +6943,15 @@ buf_reload(buf, orig_mode) - /* restore curwin/curbuf and a few other things */ - aucmd_restbuf(&aco); - /* Careful: autocommands may have made "buf" invalid! */ - } - --/*ARGSUSED*/ - void - buf_store_time(buf, st, fname) - buf_T *buf; - struct stat *st; -- char_u *fname; -+ char_u *fname UNUSED; - { - buf->b_mtime = (long)st->st_mtime; - buf->b_orig_size = (size_t)st->st_size; - #ifdef HAVE_ST_MODE - buf->b_orig_mode = (int)st->st_mode; -@@ -6811,34 +7002,60 @@ vim_deltempdir() - vim_tempdir = NULL; - } - } - #endif - -+#ifdef TEMPDIRNAMES -+/* -+ * Directory "tempdir" was created. Expand this name to a full path and put -+ * it in "vim_tempdir". This avoids that using ":cd" would confuse us. -+ * "tempdir" must be no longer than MAXPATHL. -+ */ -+ static void -+vim_settempdir(tempdir) -+ char_u *tempdir; -+{ -+ char_u *buf; -+ -+ buf = alloc((unsigned)MAXPATHL + 2); -+ if (buf != NULL) -+ { -+ if (vim_FullName(tempdir, buf, MAXPATHL, FALSE) == FAIL) -+ STRCPY(buf, tempdir); -+# ifdef __EMX__ -+ if (vim_strchr(buf, '/') != NULL) -+ STRCAT(buf, "/"); -+ else -+# endif -+ add_pathsep(buf); -+ vim_tempdir = vim_strsave(buf); -+ vim_free(buf); -+ } -+} -+#endif -+ - /* - * vim_tempname(): Return a unique name that can be used for a temp file. - * - * The temp file is NOT created. - * - * The returned pointer is to allocated memory. - * The returned pointer is NULL if no valid name was found. - */ --/*ARGSUSED*/ - char_u * - vim_tempname(extra_char) -- int extra_char; /* character to use in the name instead of '?' */ -+ int extra_char UNUSED; /* char to use in the name instead of '?' */ - { - #ifdef USE_TMPNAM - char_u itmp[L_tmpnam]; /* use tmpnam() */ - #else - char_u itmp[TEMPNAMELEN]; - #endif - - #ifdef TEMPDIRNAMES - static char *(tempdirs[]) = {TEMPDIRNAMES}; - int i; -- long nr; -- long off; - # ifndef EEXIST - struct stat st; - # endif - - /* -@@ -6851,12 +7068,18 @@ vim_tempname(extra_char) - if (vim_tempdir == NULL) - { - /* - * Try the entries in TEMPDIRNAMES to create the temp directory. - */ -- for (i = 0; i < sizeof(tempdirs) / sizeof(char *); ++i) -+ for (i = 0; i < (int)(sizeof(tempdirs) / sizeof(char *)); ++i) - { -+# ifndef HAVE_MKDTEMP -+ size_t itmplen; -+ long nr; -+ long off; -+# endif -+ - /* expand $TMP, leave room for "/v1100000/999999999" */ - expand_env((char_u *)tempdirs[i], itmp, TEMPNAMELEN - 20); - if (mch_isdir(itmp)) /* directory exists */ - { - # ifdef __EMX__ -@@ -6867,74 +7090,63 @@ vim_tempname(extra_char) - STRCAT(itmp, "/"); - else - # endif - add_pathsep(itmp); - -+# ifdef HAVE_MKDTEMP -+ /* Leave room for filename */ -+ STRCAT(itmp, "vXXXXXX"); -+ if (mkdtemp((char *)itmp) != NULL) -+ vim_settempdir(itmp); -+# else - /* Get an arbitrary number of up to 6 digits. When it's - * unlikely that it already exists it will be faster, - * otherwise it doesn't matter. The use of mkdir() avoids any - * security problems because of the predictable number. */ - nr = (mch_get_pid() + (long)time(NULL)) % 1000000L; -+ itmplen = STRLEN(itmp); - - /* Try up to 10000 different values until we find a name that - * doesn't exist. */ - for (off = 0; off < 10000L; ++off) - { - int r; --#if defined(UNIX) || defined(VMS) -+# if defined(UNIX) || defined(VMS) - mode_t umask_save; --#endif -+# endif - -- sprintf((char *)itmp + STRLEN(itmp), "v%ld", nr + off); --# ifndef EEXIST -+ sprintf((char *)itmp + itmplen, "v%ld", nr + off); -+# ifndef EEXIST - /* If mkdir() does not set errno to EEXIST, check for - * existing file here. There is a race condition then, - * although it's fail-safe. */ - if (mch_stat((char *)itmp, &st) >= 0) - continue; --# endif --#if defined(UNIX) || defined(VMS) -+# endif -+# if defined(UNIX) || defined(VMS) - /* Make sure the umask doesn't remove the executable bit. - * "repl" has been reported to use "177". */ - umask_save = umask(077); --#endif -+# endif - r = vim_mkdir(itmp, 0700); --#if defined(UNIX) || defined(VMS) -+# if defined(UNIX) || defined(VMS) - (void)umask(umask_save); --#endif -+# endif - if (r == 0) - { -- char_u *buf; -- -- /* Directory was created, use this name. -- * Expand to full path; When using the current -- * directory a ":cd" would confuse us. */ -- buf = alloc((unsigned)MAXPATHL + 1); -- if (buf != NULL) -- { -- if (vim_FullName(itmp, buf, MAXPATHL, FALSE) -- == FAIL) -- STRCPY(buf, itmp); --# ifdef __EMX__ -- if (vim_strchr(buf, '/') != NULL) -- STRCAT(buf, "/"); -- else --# endif -- add_pathsep(buf); -- vim_tempdir = vim_strsave(buf); -- vim_free(buf); -- } -+ vim_settempdir(itmp); - break; - } --# ifdef EEXIST -+# ifdef EEXIST - /* If the mkdir() didn't fail because the file/dir exists, - * we probably can't create any dir here, try another - * place. */ - if (errno != EEXIST) --# endif -+# endif - break; - } -+# endif /* HAVE_MKDTEMP */ - if (vim_tempdir != NULL) - break; - } - } - } -@@ -7711,11 +7923,14 @@ au_event_disable(what) - if (save_ei != NULL) - { - new_ei = vim_strnsave(p_ei, (int)(STRLEN(p_ei) + STRLEN(what))); - if (new_ei != NULL) - { -- STRCAT(new_ei, what); -+ if (*what == ',' && *p_ei == NUL) -+ STRCPY(new_ei, what + 1); -+ else -+ STRCAT(new_ei, what); - set_string_option_direct((char_u *)"ei", -1, new_ei, - OPT_FREE, SID_NONE); - vim_free(new_ei); - } - } -@@ -8243,11 +8458,11 @@ ex_doautoall(eap) - /* execute the autocommands for this buffer */ - retval = do_doautocmd(eap->arg, FALSE); - - /* Execute the modeline settings, but don't set window-local - * options if we are using the current window for another buffer. */ -- do_modelines(aco.save_curwin == NULL ? OPT_NOWIN : 0); -+ do_modelines(curwin == aucmd_win ? OPT_NOWIN : 0); - - /* restore the current window */ - aucmd_restbuf(&aco); - - /* stop if there is some error or buffer was deleted */ -@@ -8259,23 +8474,24 @@ ex_doautoall(eap) - check_cursor(); /* just in case lines got deleted */ - } - - /* - * Prepare for executing autocommands for (hidden) buffer "buf". -- * Search a window for the current buffer. Save the cursor position and -- * screen offset. -+ * Search for a visible window containing the current buffer. If there isn't -+ * one then use "aucmd_win". - * Set "curbuf" and "curwin" to match "buf". - * When FEAT_AUTOCMD is not defined another version is used, see below. - */ - void - aucmd_prepbuf(aco, buf) - aco_save_T *aco; /* structure to save values in */ - buf_T *buf; /* new curbuf */ - { - win_T *win; -- -- aco->new_curbuf = buf; -+#ifdef FEAT_WINDOWS -+ int save_ea; -+#endif - - /* Find a window that is for the new buffer */ - if (buf == curbuf) /* be quick when buf is curbuf */ - win = curwin; - else -@@ -8285,46 +8501,71 @@ aucmd_prepbuf(aco, buf) - break; - #else - win = NULL; - #endif - -- /* -- * Prefer to use an existing window for the buffer, it has the least side -- * effects (esp. if "buf" is curbuf). -- * Otherwise, use curwin for "buf". It might make some items in the -- * window invalid. At least save the cursor and topline. -- */ -+ /* Allocate "aucmd_win" when needed. If this fails (out of memory) fall -+ * back to using the current window. */ -+ if (win == NULL && aucmd_win == NULL) -+ { -+ win_alloc_aucmd_win(); -+ if (aucmd_win == NULL) -+ win = curwin; -+ } -+ if (win == NULL && aucmd_win_used) -+ /* Strange recursive autocommand, fall back to using the current -+ * window. Expect a few side effects... */ -+ win = curwin; -+ -+ aco->save_curwin = curwin; -+ aco->save_curbuf = curbuf; - if (win != NULL) - { -- /* there is a window for "buf", make it the curwin */ -- aco->save_curwin = curwin; -+ /* There is a window for "buf" in the current tab page, make it the -+ * curwin. This is preferred, it has the least side effects (esp. if -+ * "buf" is curbuf). */ -+ aco->use_aucmd_win = FALSE; - curwin = win; -- aco->save_buf = win->w_buffer; -- aco->new_curwin = win; - } - else - { -- /* there is no window for "buf", use curwin */ -- aco->save_curwin = NULL; -- aco->save_buf = curbuf; -- --curbuf->b_nwindows; -- curwin->w_buffer = buf; -+ /* There is no window for "buf", use "aucmd_win". To minimize the side -+ * effects, insert it in a the current tab page. -+ * Anything related to a window (e.g., setting folds) may have -+ * unexpected results. */ -+ aco->use_aucmd_win = TRUE; -+ aucmd_win_used = TRUE; -+ aucmd_win->w_buffer = buf; - ++buf->b_nwindows; -+ win_init_empty(aucmd_win); /* set cursor and topline to safe values */ -+ vim_free(aucmd_win->w_localdir); -+ aucmd_win->w_localdir = NULL; -+ -+ /* Make sure w_localdir and globaldir are NULL to avoid a chdir() in -+ * win_enter_ext(). */ -+ aucmd_win->w_localdir = NULL; -+ aco->globaldir = globaldir; -+ globaldir = NULL; - -- /* save cursor and topline, set them to safe values */ -- aco->save_cursor = curwin->w_cursor; -- curwin->w_cursor.lnum = 1; -- curwin->w_cursor.col = 0; -- aco->save_topline = curwin->w_topline; -- curwin->w_topline = 1; --#ifdef FEAT_DIFF -- aco->save_topfill = curwin->w_topfill; -- curwin->w_topfill = 0; -+ -+#ifdef FEAT_WINDOWS -+ /* Split the current window, put the aucmd_win in the upper half. -+ * We don't want the BufEnter or WinEnter autocommands. */ -+ block_autocmds(); -+ make_snapshot(SNAP_AUCMD_IDX); -+ save_ea = p_ea; -+ p_ea = FALSE; -+ (void)win_split_ins(0, WSP_TOP, aucmd_win, 0); -+ (void)win_comp_pos(); /* recompute window positions */ -+ p_ea = save_ea; -+ unblock_autocmds(); - #endif -+ curwin = aucmd_win; - } -- - curbuf = buf; -+ aco->new_curwin = curwin; -+ aco->new_curbuf = curbuf; - } - - /* - * Cleanup after executing autocommands for a (hidden) buffer. - * Restore the window as it was (if possible). -@@ -8332,61 +8573,105 @@ aucmd_prepbuf(aco, buf) - */ - void - aucmd_restbuf(aco) - aco_save_T *aco; /* structure holding saved values */ - { -- if (aco->save_curwin != NULL) -+#ifdef FEAT_WINDOWS -+ int dummy; -+#endif -+ -+ if (aco->use_aucmd_win) -+ { -+ --curbuf->b_nwindows; -+#ifdef FEAT_WINDOWS -+ /* Find "aucmd_win", it can't be closed, but it may be in another tab -+ * page. Do not trigger autocommands here. */ -+ block_autocmds(); -+ if (curwin != aucmd_win) -+ { -+ tabpage_T *tp; -+ win_T *wp; -+ -+ FOR_ALL_TAB_WINDOWS(tp, wp) -+ { -+ if (wp == aucmd_win) -+ { -+ if (tp != curtab) -+ goto_tabpage_tp(tp); -+ win_goto(aucmd_win); -+ break; -+ } -+ } -+ } -+ -+ /* Remove the window and frame from the tree of frames. */ -+ (void)winframe_remove(curwin, &dummy, NULL); -+ win_remove(curwin, NULL); -+ aucmd_win_used = FALSE; -+ last_status(FALSE); /* may need to remove last status line */ -+ restore_snapshot(SNAP_AUCMD_IDX, FALSE); -+ (void)win_comp_pos(); /* recompute window positions */ -+ unblock_autocmds(); -+ -+ if (win_valid(aco->save_curwin)) -+ curwin = aco->save_curwin; -+ else -+ /* Hmm, original window disappeared. Just use the first one. */ -+ curwin = firstwin; -+# ifdef FEAT_EVAL -+ vars_clear(&aucmd_win->w_vars.dv_hashtab); /* free all w: variables */ -+ hash_init(&aucmd_win->w_vars.dv_hashtab); /* re-use the hashtab */ -+# endif -+#else -+ curwin = aco->save_curwin; -+#endif -+ curbuf = curwin->w_buffer; -+ -+ vim_free(globaldir); -+ globaldir = aco->globaldir; -+ -+ /* the buffer contents may have changed */ -+ check_cursor(); -+ if (curwin->w_topline > curbuf->b_ml.ml_line_count) -+ { -+ curwin->w_topline = curbuf->b_ml.ml_line_count; -+#ifdef FEAT_DIFF -+ curwin->w_topfill = 0; -+#endif -+ } -+#if defined(FEAT_GUI) -+ /* Hide the scrollbars from the aucmd_win and update. */ -+ gui_mch_enable_scrollbar(&aucmd_win->w_scrollbars[SBAR_LEFT], FALSE); -+ gui_mch_enable_scrollbar(&aucmd_win->w_scrollbars[SBAR_RIGHT], FALSE); -+ gui_may_update_scrollbars(); -+#endif -+ } -+ else - { - /* restore curwin */ - #ifdef FEAT_WINDOWS - if (win_valid(aco->save_curwin)) - #endif - { -- /* restore the buffer which was previously edited by curwin, if -- * it's still the same window and it's valid */ -+ /* Restore the buffer which was previously edited by curwin, if -+ * it was changed, we are still the same window and the buffer is -+ * valid. */ - if (curwin == aco->new_curwin -- && buf_valid(aco->save_buf) -- && aco->save_buf->b_ml.ml_mfp != NULL) -+ && curbuf != aco->new_curbuf -+ && buf_valid(aco->new_curbuf) -+ && aco->new_curbuf->b_ml.ml_mfp != NULL) - { - --curbuf->b_nwindows; -- curbuf = aco->save_buf; -+ curbuf = aco->new_curbuf; - curwin->w_buffer = curbuf; - ++curbuf->b_nwindows; - } - - curwin = aco->save_curwin; - curbuf = curwin->w_buffer; - } - } -- else -- { -- /* restore buffer for curwin if it still exists and is loaded */ -- if (buf_valid(aco->save_buf) && aco->save_buf->b_ml.ml_mfp != NULL) -- { -- --curbuf->b_nwindows; -- curbuf = aco->save_buf; -- curwin->w_buffer = curbuf; -- ++curbuf->b_nwindows; -- curwin->w_cursor = aco->save_cursor; -- check_cursor(); -- /* check topline < line_count, in case lines got deleted */ -- if (aco->save_topline <= curbuf->b_ml.ml_line_count) -- { -- curwin->w_topline = aco->save_topline; --#ifdef FEAT_DIFF -- curwin->w_topfill = aco->save_topfill; --#endif -- } -- else -- { -- curwin->w_topline = curbuf->b_ml.ml_line_count; --#ifdef FEAT_DIFF -- curwin->w_topfill = 0; --#endif -- } -- } -- } - } - - static int autocmd_nested = FALSE; - - /* -@@ -8521,10 +8806,11 @@ apply_autocmds_group(event, fname, fname - buf_T *old_curbuf; - int retval = FALSE; - char_u *save_sourcing_name; - linenr_T save_sourcing_lnum; - char_u *save_autocmd_fname; -+ int save_autocmd_fname_full; - int save_autocmd_bufnr; - char_u *save_autocmd_match; - int save_autocmd_busy; - int save_autocmd_nested; - static int nesting = 0; -@@ -8599,10 +8885,11 @@ apply_autocmds_group(event, fname, fname - - /* - * Save the autocmd_* variables and info about the current buffer. - */ - save_autocmd_fname = autocmd_fname; -+ save_autocmd_fname_full = autocmd_fname_full; - save_autocmd_bufnr = autocmd_bufnr; - save_autocmd_match = autocmd_match; - save_autocmd_busy = autocmd_busy; - save_autocmd_nested = autocmd_nested; - save_changed = curbuf->b_changed; -@@ -8616,18 +8903,19 @@ apply_autocmds_group(event, fname, fname - if (fname_io == NULL) - { - if (fname != NULL && *fname != NUL) - autocmd_fname = fname; - else if (buf != NULL) -- autocmd_fname = buf->b_fname; -+ autocmd_fname = buf->b_ffname; - else - autocmd_fname = NULL; - } - else - autocmd_fname = fname_io; - if (autocmd_fname != NULL) -- autocmd_fname = FullName_save(autocmd_fname, FALSE); -+ autocmd_fname = vim_strsave(autocmd_fname); -+ autocmd_fname_full = FALSE; /* call FullName_save() later */ - - /* - * Set the buffer number to be used for <abuf>. - */ - if (buf == NULL) -@@ -8665,13 +8953,15 @@ apply_autocmds_group(event, fname, fname - fname = vim_strsave(fname); /* make a copy, so we can change it */ - } - else - { - sfname = vim_strsave(fname); -- /* Don't try expanding FileType, Syntax, WindowID or QuickFixCmd* */ -+ /* Don't try expanding FileType, Syntax, FuncUndefined, WindowID or -+ * QuickFixCmd* */ - if (event == EVENT_FILETYPE - || event == EVENT_SYNTAX -+ || event == EVENT_FUNCUNDEFINED - || event == EVENT_REMOTEREPLY - || event == EVENT_SPELLFILEMISSING - || event == EVENT_QUICKFIXCMDPRE - || event == EVENT_QUICKFIXCMDPOST) - fname = vim_strsave(fname); -@@ -8808,10 +9098,11 @@ apply_autocmds_group(event, fname, fname - vim_free(sourcing_name); - sourcing_name = save_sourcing_name; - sourcing_lnum = save_sourcing_lnum; - vim_free(autocmd_fname); - autocmd_fname = save_autocmd_fname; -+ autocmd_fname_full = save_autocmd_fname_full; - autocmd_bufnr = save_autocmd_bufnr; - autocmd_match = save_autocmd_match; - #ifdef FEAT_EVAL - current_SID = save_current_SID; - restore_funccal(save_funccalp); -@@ -8916,11 +9207,11 @@ auto_next_pat(apc, stop_at_last) - - for (ap = apc->curpat; ap != NULL && !got_int; ap = ap->next) - { - apc->curpat = NULL; - -- /* only use a pattern when it has not been removed, has commands and -+ /* Only use a pattern when it has not been removed, has commands and - * the group matches. For buffer-local autocommands only check the - * buffer number. */ - if (ap->pat != NULL && ap->cmds != NULL - && (apc->group == AUGROUP_ALL || apc->group == ap->group)) - { -@@ -8965,16 +9256,15 @@ auto_next_pat(apc, stop_at_last) - /* - * Get next autocommand command. - * Called by do_cmdline() to get the next line for ":if". - * Returns allocated string, or NULL for end of autocommands. - */ --/* ARGSUSED */ - static char_u * - getnextac(c, cookie, indent) -- int c; /* not used */ -+ int c UNUSED; - void *cookie; -- int indent; /* not used */ -+ int indent UNUSED; - { - AutoPatCmd *acp = (AutoPatCmd *)cookie; - char_u *retval; - AutoCmd *ac; - -@@ -9081,14 +9371,13 @@ has_autocmd(event, sfname, buf) - #if defined(FEAT_CMDL_COMPL) || defined(PROTO) - /* - * Function given to ExpandGeneric() to obtain the list of autocommand group - * names. - */ --/*ARGSUSED*/ - char_u * - get_augroup_name(xp, idx) -- expand_T *xp; -+ expand_T *xp UNUSED; - int idx; - { - if (idx == augroups.ga_len) /* add "END" add the end */ - return (char_u *)"END"; - if (idx >= augroups.ga_len) /* end of list */ -@@ -9102,11 +9391,11 @@ static int include_groups = FALSE; - - char_u * - set_context_in_autocmd(xp, arg, doautocmd) - expand_T *xp; - char_u *arg; -- int doautocmd; /* TRUE for :doautocmd, FALSE for :autocmd */ -+ int doautocmd; /* TRUE for :doauto*, FALSE for :autocmd */ - { - char_u *p; - int group; - - /* check for a group name, skip it if present */ -@@ -9150,14 +9439,13 @@ set_context_in_autocmd(xp, arg, doautocm - } - - /* - * Function given to ExpandGeneric() to obtain the list of event names. - */ --/*ARGSUSED*/ - char_u * - get_event_name(xp, idx) -- expand_T *xp; -+ expand_T *xp UNUSED; - int idx; - { - if (idx < augroups.ga_len) /* First list group names, if wanted */ - { - if (!include_groups || AUGROUP_NAME(idx) == NULL) -@@ -9252,30 +9540,26 @@ au_exists(arg) - * If there isn't any, return FALSE; - * If there is one and no pattern given, return TRUE; */ - ap = first_autopat[(int)event]; - if (ap == NULL) - goto theend; -- if (pattern == NULL) -- { -- retval = TRUE; -- goto theend; -- } - - /* if pattern is "<buffer>", special handling is needed which uses curbuf */ - /* for pattern "<buffer=N>, fnamecmp() will work fine */ -- if (STRICMP(pattern, "<buffer>") == 0) -+ if (pattern != NULL && STRICMP(pattern, "<buffer>") == 0) - buflocal_buf = curbuf; - - /* Check if there is an autocommand with the given pattern. */ - for ( ; ap != NULL; ap = ap->next) - /* only use a pattern when it has not been removed and has commands. */ - /* For buffer-local autocommands, fnamecmp() works fine. */ - if (ap->pat != NULL && ap->cmds != NULL - && (group == AUGROUP_ALL || ap->group == group) -- && (buflocal_buf == NULL -- ? fnamecmp(ap->pat, pattern) == 0 -- : ap->buflocal_nr == buflocal_buf->b_fnum)) -+ && (pattern == NULL -+ || (buflocal_buf == NULL -+ ? fnamecmp(ap->pat, pattern) == 0 -+ : ap->buflocal_nr == buflocal_buf->b_fnum))) - { - retval = TRUE; - break; - } - -@@ -9294,25 +9578,29 @@ theend: - void - aucmd_prepbuf(aco, buf) - aco_save_T *aco; /* structure to save values in */ - buf_T *buf; /* new curbuf */ - { -- aco->save_buf = curbuf; -+ aco->save_curbuf = curbuf; -+ --curbuf->b_nwindows; - curbuf = buf; - curwin->w_buffer = buf; -+ ++curbuf->b_nwindows; - } - - /* - * Restore after executing commands for a (hidden) buffer. - * This is the non-autocommand version. - */ - void - aucmd_restbuf(aco) - aco_save_T *aco; /* structure holding saved values */ - { -- curbuf = aco->save_buf; -+ --curbuf->b_nwindows; -+ curbuf = aco->save_curbuf; - curwin->w_buffer = curbuf; -+ ++curbuf->b_nwindows; - } - - #endif /* FEAT_AUTOCMD */ - - -@@ -9465,17 +9753,16 @@ match_file_list(list, sfname, ffname) - * If FEAT_OSFILETYPE defined then pass initial <type> through unchanged. Eg: - * '<html>myfile' becomes '<html>^myfile$' -- leonard. - * - * Returns NULL when out of memory. - */ --/*ARGSUSED*/ - char_u * - file_pat_to_reg_pat(pat, pat_end, allow_dirs, no_bslash) - char_u *pat; - char_u *pat_end; /* first char after pattern or NULL */ - char *allow_dirs; /* Result passed back out in here */ -- int no_bslash; /* Don't use a backward slash as pathsep */ -+ int no_bslash UNUSED; /* Don't use a backward slash as pathsep */ - { - int size; - char_u *endp; - char_u *reg_pat; - char_u *p; ---- vim72.orig/src/fold.c -+++ vim72/src/fold.c -@@ -46,11 +46,11 @@ typedef struct - static void newFoldLevelWin __ARGS((win_T *wp)); - static int checkCloseRec __ARGS((garray_T *gap, linenr_T lnum, int level)); - static int foldFind __ARGS((garray_T *gap, linenr_T lnum, fold_T **fpp)); - static int foldLevelWin __ARGS((win_T *wp, linenr_T lnum)); - static void checkupdate __ARGS((win_T *wp)); --static void setFoldRepeat __ARGS((linenr_T lnum, long count, int open)); -+static void setFoldRepeat __ARGS((linenr_T lnum, long count, int do_open)); - static linenr_T setManualFold __ARGS((linenr_T lnum, int opening, int recurse, int *donep)); - static linenr_T setManualFoldWin __ARGS((win_T *wp, linenr_T lnum, int opening, int recurse, int *donep)); - static void foldOpenNested __ARGS((fold_T *fpr)); - static void deleteFoldEntry __ARGS((garray_T *gap, int idx, int recursive)); - static void foldMarkAdjustRecurse __ARGS((garray_T *gap, linenr_T line1, linenr_T line2, long amount, long amount_after)); -@@ -738,11 +738,11 @@ deleteFold(start, end, recursive, had_vi - garray_T *gap; - fold_T *fp; - garray_T *found_ga; - fold_T *found_fp = NULL; - linenr_T found_off = 0; -- int use_level = FALSE; -+ int use_level; - int maybe_small = FALSE; - int level = 0; - linenr_T lnum = start; - linenr_T lnum_off; - int did_one = FALSE; -@@ -755,10 +755,11 @@ deleteFold(start, end, recursive, had_vi - { - /* Find the deepest fold for "start". */ - gap = &curwin->w_folds; - found_ga = NULL; - lnum_off = 0; -+ use_level = FALSE; - for (;;) - { - if (!foldFind(gap, lnum - lnum_off, &fp)) - break; - /* lnum is inside this fold, remember info */ -@@ -781,24 +782,25 @@ deleteFold(start, end, recursive, had_vi - ++lnum; - } - else - { - lnum = found_fp->fd_top + found_fp->fd_len + found_off; -- did_one = TRUE; - - if (foldmethodIsManual(curwin)) - deleteFoldEntry(found_ga, - (int)(found_fp - (fold_T *)found_ga->ga_data), recursive); - else - { -- if (found_fp->fd_top + found_off < first_lnum) -- first_lnum = found_fp->fd_top; -- if (lnum > last_lnum) -+ if (first_lnum > found_fp->fd_top + found_off) -+ first_lnum = found_fp->fd_top + found_off; -+ if (last_lnum < lnum) - last_lnum = lnum; -- parseMarker(curwin); -+ if (!did_one) -+ parseMarker(curwin); - deleteFoldMarkers(found_fp, recursive, found_off); - } -+ did_one = TRUE; - - /* redraw window */ - changed_window_setting(); - } - } -@@ -809,10 +811,14 @@ deleteFold(start, end, recursive, had_vi - /* Force a redraw to remove the Visual highlighting. */ - if (had_visual) - redraw_curbuf_later(INVERTED); - #endif - } -+ else -+ /* Deleting markers may make cursor column invalid. */ -+ check_cursor_col(); -+ - if (last_lnum > 0) - changed_lines(first_lnum, (colnr_T)0, last_lnum, 0L); - } - - /* clearFolding() {{{2 */ -@@ -841,11 +847,11 @@ foldUpdate(wp, top, bot) - linenr_T bot; - { - fold_T *fp; - - /* Mark all folds from top to bot as maybe-small. */ -- (void)foldFind(&curwin->w_folds, curwin->w_cursor.lnum, &fp); -+ (void)foldFind(&curwin->w_folds, top, &fp); - while (fp < (fold_T *)curwin->w_folds.ga_data + curwin->w_folds.ga_len - && fp->fd_top < bot) - { - fp->fd_small = MAYBE; - ++fp; -@@ -1045,19 +1051,18 @@ find_wl_entry(win, lnum) - win_T *win; - linenr_T lnum; - { - int i; - -- if (win->w_lines_valid > 0) -- for (i = 0; i < win->w_lines_valid; ++i) -- if (win->w_lines[i].wl_valid) -- { -- if (lnum < win->w_lines[i].wl_lnum) -- return -1; -- if (lnum <= win->w_lines[i].wl_lastlnum) -- return i; -- } -+ for (i = 0; i < win->w_lines_valid; ++i) -+ if (win->w_lines[i].wl_valid) -+ { -+ if (lnum < win->w_lines[i].wl_lnum) -+ return -1; -+ if (lnum <= win->w_lines[i].wl_lastlnum) -+ return i; -+ } - return -1; - } - - /* foldAdjustVisual() {{{2 */ - #ifdef FEAT_VISUAL -@@ -1239,22 +1244,22 @@ checkupdate(wp) - /* - * Open or close fold for current window at line "lnum". - * Repeat "count" times. - */ - static void --setFoldRepeat(lnum, count, open) -+setFoldRepeat(lnum, count, do_open) - linenr_T lnum; - long count; -- int open; -+ int do_open; - { - int done; - long n; - - for (n = 0; n < count; ++n) - { - done = DONE_NOTHING; -- (void)setManualFold(lnum, open, FALSE, &done); -+ (void)setManualFold(lnum, do_open, FALSE, &done); - if (!(done & DONE_ACTION)) - { - /* Only give an error message when no fold could be opened. */ - if (n == 0 && !(done & DONE_FOLD)) - EMSG(_(e_nofold)); -@@ -1599,15 +1604,15 @@ foldMarkAdjustRecurse(gap, line1, line2, - else - fp->fd_top += amount; - } - else - { -- /* 2, 3, or 5: need to correct nested folds too */ -- foldMarkAdjustRecurse(&fp->fd_nested, line1 - fp->fd_top, -- line2 - fp->fd_top, amount, amount_after); - if (fp->fd_top < top) - { -+ /* 2 or 3: need to correct nested folds too */ -+ foldMarkAdjustRecurse(&fp->fd_nested, line1 - fp->fd_top, -+ line2 - fp->fd_top, amount, amount_after); - if (last <= line2) - { - /* 2. fold contains line1, line2 is below fold */ - if (amount == MAXLNUM) - fp->fd_len = line1 - fp->fd_top; -@@ -1620,11 +1625,15 @@ foldMarkAdjustRecurse(gap, line1, line2, - fp->fd_len += amount_after; - } - } - else - { -- /* 5. fold is below line1 and contains line2 */ -+ /* 5. fold is below line1 and contains line2; need to -+ * correct nested folds too */ -+ foldMarkAdjustRecurse(&fp->fd_nested, line1 - fp->fd_top, -+ line2 - fp->fd_top, amount, -+ amount_after + (fp->fd_top - top)); - if (amount == MAXLNUM) - { - fp->fd_len -= line2 - fp->fd_top + 1; - fp->fd_top = line1; - } -@@ -1920,11 +1929,11 @@ get_foldtext(wp, lnum, lnume, foldinfo, - char_u *text = NULL; - - #ifdef FEAT_EVAL - if (*wp->w_p_fdt != NUL) - { -- char_u dashes[51]; -+ char_u dashes[MAX_LEVEL + 2]; - win_T *save_curwin; - int level; - char_u *p; - - /* Set "v:foldstart" and "v:foldend". */ -@@ -1932,12 +1941,12 @@ get_foldtext(wp, lnum, lnume, foldinfo, - set_vim_var_nr(VV_FOLDEND, lnume); - - /* Set "v:folddashes" to a string of "level" dashes. */ - /* Set "v:foldlevel" to "level". */ - level = foldinfo->fi_level; -- if (level > 50) -- level = 50; -+ if (level > (int)sizeof(dashes) - 1) -+ level = (int)sizeof(dashes) - 1; - vim_memset(dashes, '-', (size_t)level); - dashes[level] = NUL; - set_vim_var_string(VV_FOLDDASHES, dashes, -1); - set_vim_var_nr(VV_FOLDLEVEL, (long)level); - save_curwin = curwin; -@@ -2244,10 +2253,44 @@ foldUpdateIEMS(wp, top, bot) - if (fline.lvl >= 0) - break; - } - } - -+ /* -+ * If folding is defined by the syntax, it is possible that a change in -+ * one line will cause all sub-folds of the current fold to change (e.g., -+ * closing a C-style comment can cause folds in the subsequent lines to -+ * appear). To take that into account we should adjust the value of "bot" -+ * to point to the end of the current fold: -+ */ -+ if (foldlevelSyntax == getlevel) -+ { -+ garray_T *gap = &wp->w_folds; -+ fold_T *fp = NULL; -+ int current_fdl = 0; -+ linenr_T fold_start_lnum = 0; -+ linenr_T lnum_rel = fline.lnum; -+ -+ while (current_fdl < fline.lvl) -+ { -+ if (!foldFind(gap, lnum_rel, &fp)) -+ break; -+ ++current_fdl; -+ -+ fold_start_lnum += fp->fd_top; -+ gap = &fp->fd_nested; -+ lnum_rel -= fp->fd_top; -+ } -+ if (fp != NULL && current_fdl == fline.lvl) -+ { -+ linenr_T fold_end_lnum = fold_start_lnum + fp->fd_len; -+ -+ if (fold_end_lnum > bot) -+ bot = fold_end_lnum; -+ } -+ } -+ - start = fline.lnum; - end = bot; - /* Do at least one line. */ - if (start > end && end < wp->w_buffer->b_ml.ml_line_count) - end = start; -@@ -2805,10 +2848,12 @@ foldSplit(gap, i, top, bot) - return; - fp = (fold_T *)gap->ga_data + i; - fp[1].fd_top = bot + 1; - fp[1].fd_len = fp->fd_len - (fp[1].fd_top - fp->fd_top); - fp[1].fd_flags = fp->fd_flags; -+ fp[1].fd_small = MAYBE; -+ fp->fd_small = MAYBE; - - /* Move nested folds below bot to new fold. There can't be - * any between top and bot, they have been removed by the caller. */ - gap1 = &fp->fd_nested; - gap2 = &fp[1].fd_nested; -@@ -3191,12 +3236,12 @@ foldlevelMarker(flp) - if (n > 0) - { - flp->lvl = n; - flp->lvl_next = n - 1; - /* never start a fold with an end marker */ -- if (flp->lvl_next > flp->lvl) -- flp->lvl_next = flp->lvl; -+ if (flp->lvl_next > start_lvl) -+ flp->lvl_next = start_lvl; - } - } - else - --flp->lvl_next; - } ---- vim72.orig/src/getchar.c -+++ vim72/src/getchar.c -@@ -20,11 +20,11 @@ - - /* - * These buffers are used for storing: - * - stuffed characters: A command that is translated into another command. - * - redo characters: will redo the last change. -- * - recorded chracters: for the "q" command. -+ * - recorded characters: for the "q" command. - * - * The bytes are stored like in the typeahead buffer: - * - K_SPECIAL introduces a special key (two more bytes follow). A literal - * K_SPECIAL is stored as K_SPECIAL KS_SPECIAL KE_FILLER. - * - CSI introduces a GUI termcap code (also when gui.in_use is FALSE, -@@ -127,11 +127,11 @@ static void closescript __ARGS((void)); - static int vgetorpeek __ARGS((int)); - static void map_free __ARGS((mapblock_T **)); - static void validate_maphash __ARGS((void)); - static void showmap __ARGS((mapblock_T *mp, int local)); - #ifdef FEAT_EVAL --static char_u *eval_map_expr __ARGS((char_u *str)); -+static char_u *eval_map_expr __ARGS((char_u *str, int c)); - #endif - - /* - * Free and clear a buffer. - */ -@@ -1281,11 +1281,11 @@ free_typebuf() - { - if (typebuf.tb_buf == typebuf_init) - EMSG2(_(e_intern2), "Free typebuf 1"); - else - vim_free(typebuf.tb_buf); -- if (typebuf.tb_buf == noremapbuf_init) -+ if (typebuf.tb_noremap == noremapbuf_init) - EMSG2(_(e_intern2), "Free typebuf 2"); - else - vim_free(typebuf.tb_noremap); - } - -@@ -1307,10 +1307,13 @@ save_typebuf() - return FAIL; - } - return OK; - } - -+static int old_char = -1; /* character put back by vungetc() */ -+static int old_mod_mask; /* mod_mask for ungotten character */ -+ - #if defined(FEAT_EVAL) || defined(FEAT_EX_EXTRA) || defined(PROTO) - - /* - * Save all three kinds of typeahead, so that the user must type at a prompt. - */ -@@ -1321,10 +1324,14 @@ save_typeahead(tp) - tp->save_typebuf = typebuf; - tp->typebuf_valid = (alloc_typebuf() == OK); - if (!tp->typebuf_valid) - typebuf = tp->save_typebuf; - -+ tp->old_char = old_char; -+ tp->old_mod_mask = old_mod_mask; -+ old_char = -1; -+ - tp->save_stuffbuff = stuffbuff; - stuffbuff.bh_first.b_next = NULL; - # ifdef USE_INPUT_BUF - tp->save_inputbuf = get_input_buf(); - # endif -@@ -1342,10 +1349,13 @@ restore_typeahead(tp) - { - free_typebuf(); - typebuf = tp->save_typebuf; - } - -+ old_char = tp->old_char; -+ old_mod_mask = tp->old_mod_mask; -+ - free_buff(&stuffbuff); - stuffbuff = tp->save_stuffbuff; - # ifdef USE_INPUT_BUF - set_input_buf(tp->save_inputbuf); - # endif -@@ -1497,21 +1507,18 @@ updatescript(c) - } - - #define KL_PART_KEY -1 /* keylen value for incomplete key-code */ - #define KL_PART_MAP -2 /* keylen value for incomplete mapping */ - --static int old_char = -1; /* character put back by vungetc() */ --static int old_mod_mask; /* mod_mask for ungotten character */ -- - /* - * Get the next input character. - * Can return a special key or a multi-byte character. - * Can return NUL when called recursively, use safe_vgetc() if that's not - * wanted. - * This translates escaped K_SPECIAL and CSI bytes to a K_SPECIAL or CSI byte. - * Collects the bytes of a multibyte character into the whole character. -- * Returns the modifers in the global "mod_mask". -+ * Returns the modifiers in the global "mod_mask". - */ - int - vgetc() - { - int c, c2; -@@ -2380,10 +2387,21 @@ vgetorpeek(advance) - } - - /* complete match */ - if (keylen >= 0 && keylen <= typebuf.tb_len) - { -+#ifdef FEAT_EVAL -+ int save_m_expr; -+ int save_m_noremap; -+ int save_m_silent; -+ char_u *save_m_keys; -+ char_u *save_m_str; -+#else -+# define save_m_noremap mp->m_noremap -+# define save_m_silent mp->m_silent -+#endif -+ - /* write chars to script file(s) */ - if (keylen > typebuf.tb_maplen) - gotchars(typebuf.tb_buf + typebuf.tb_off - + typebuf.tb_maplen, - keylen - typebuf.tb_maplen); -@@ -2422,10 +2440,20 @@ vgetorpeek(advance) - 0, TRUE, FALSE); - } - #endif - - #ifdef FEAT_EVAL -+ /* Copy the values from *mp that are used, because -+ * evaluating the expression may invoke a function -+ * that redefines the mapping, thereby making *mp -+ * invalid. */ -+ save_m_expr = mp->m_expr; -+ save_m_noremap = mp->m_noremap; -+ save_m_silent = mp->m_silent; -+ save_m_keys = NULL; /* only saved when needed */ -+ save_m_str = NULL; /* only saved when needed */ -+ - /* - * Handle ":map <expr>": evaluate the {rhs} as an - * expression. Save and restore the typeahead so that - * getchar() can be used. Also save and restore the - * command line for "normal :". -@@ -2437,11 +2465,13 @@ vgetorpeek(advance) - - save_typeahead(&tabuf); - if (tabuf.typebuf_valid) - { - vgetc_busy = 0; -- s = eval_map_expr(mp->m_str); -+ save_m_keys = vim_strsave(mp->m_keys); -+ save_m_str = vim_strsave(mp->m_str); -+ s = eval_map_expr(save_m_str, NUL); - vgetc_busy = save_vgetc_busy; - } - else - s = NULL; - restore_typeahead(&tabuf); -@@ -2460,22 +2490,37 @@ vgetorpeek(advance) - */ - if (s == NULL) - i = FAIL; - else - { -- i = ins_typebuf(s, -- mp->m_noremap != REMAP_YES -- ? mp->m_noremap -- : STRNCMP(s, mp->m_keys, -- (size_t)keylen) != 0 -- ? REMAP_YES : REMAP_SKIP, -- 0, TRUE, cmd_silent || mp->m_silent); -+ int noremap; -+ -+ if (save_m_noremap != REMAP_YES) -+ noremap = save_m_noremap; -+ else if ( -+#ifdef FEAT_EVAL -+ STRNCMP(s, save_m_keys != NULL -+ ? save_m_keys : mp->m_keys, -+ (size_t)keylen) -+#else -+ STRNCMP(s, mp->m_keys, (size_t)keylen) -+#endif -+ != 0) -+ noremap = REMAP_YES; -+ else -+ noremap = REMAP_SKIP; -+ i = ins_typebuf(s, noremap, -+ 0, TRUE, cmd_silent || save_m_silent); - #ifdef FEAT_EVAL -- if (mp->m_expr) -+ if (save_m_expr) - vim_free(s); - #endif - } -+#ifdef FEAT_EVAL -+ vim_free(save_m_keys); -+ vim_free(save_m_str); -+#endif - if (i == FAIL) - { - c = -1; - break; - } -@@ -3311,11 +3356,11 @@ do_map(maptype, arg, mode, abbrev) - if (vim_iswordc(keys[n]) != vim_iswordc(keys[len - 2])) - { - retval = 1; - goto theend; - } -- /* An abbrevation cannot contain white space. */ -+ /* An abbreviation cannot contain white space. */ - for (n = 0; n < len; ++n) - if (vim_iswhite(keys[n])) - { - retval = 1; - goto theend; -@@ -3699,15 +3744,14 @@ get_map_mode(cmdp, forceit) - - /* - * Clear all mappings or abbreviations. - * 'abbr' should be FALSE for mappings, TRUE for abbreviations. - */ --/*ARGSUSED*/ - void - map_clear(cmdp, arg, forceit, abbr) - char_u *cmdp; -- char_u *arg; -+ char_u *arg UNUSED; - int forceit; - int abbr; - { - int mode; - #ifdef FEAT_LOCALMAP -@@ -3732,17 +3776,16 @@ map_clear(cmdp, arg, forceit, abbr) - } - - /* - * Clear all mappings in "mode". - */ --/*ARGSUSED*/ - void - map_clear_int(buf, mode, local, abbr) -- buf_T *buf; /* buffer for local mappings */ -- int mode; /* mode in which to delete */ -- int local; /* TRUE for buffer-local mappings */ -- int abbr; /* TRUE for abbreviations */ -+ buf_T *buf UNUSED; /* buffer for local mappings */ -+ int mode; /* mode in which to delete */ -+ int local UNUSED; /* TRUE for buffer-local mappings */ -+ int abbr; /* TRUE for abbreviations */ - { - mapblock_T *mp, **mpp; - int hash; - int new_hash; - -@@ -3814,11 +3857,15 @@ showmap(mp, local) - int local; /* TRUE for buffer-local map */ - { - int len = 1; - - if (msg_didout || msg_silent != 0) -+ { - msg_putchar('\n'); -+ if (got_int) /* 'q' typed at MORE prompt */ -+ return; -+ } - if ((mp->m_mode & (INSERT + CMDLINE)) == INSERT + CMDLINE) - msg_putchar('!'); /* :map! */ - else if (mp->m_mode & INSERT) - msg_putchar('i'); /* :imap */ - else if (mp->m_mode & LANGMAP) -@@ -4261,11 +4308,11 @@ check_abbr(c, ptr, col, mincol) - /* no remapping implies no abbreviation */ - return FALSE; - - /* - * Check for word before the cursor: If it ends in a keyword char all -- * chars before it must be al keyword chars or non-keyword chars, but not -+ * chars before it must be keyword chars or non-keyword chars, but not - * white space. If it ends in a non-keyword char we accept any characters - * before it except white space. - */ - if (col == 0) /* cannot be an abbr. */ - return FALSE; -@@ -4356,13 +4403,13 @@ check_abbr(c, ptr, col, mincol) - * - * Character CTRL-] is treated specially - it completes the - * abbreviation, but is not inserted into the input stream. - */ - j = 0; -- /* special key code, split up */ - if (c != Ctrl_RSB) - { -+ /* special key code, split up */ - if (IS_SPECIAL(c) || c == K_SPECIAL) - { - tb[j++] = K_SPECIAL; - tb[j++] = K_SECOND(c); - tb[j++] = K_THIRD(c); -@@ -4387,11 +4434,11 @@ check_abbr(c, ptr, col, mincol) - /* insert the last typed char */ - (void)ins_typebuf(tb, 1, 0, TRUE, mp->m_silent); - } - #ifdef FEAT_EVAL - if (mp->m_expr) -- s = eval_map_expr(mp->m_str); -+ s = eval_map_expr(mp->m_str, c); - else - #endif - s = mp->m_str; - if (s != NULL) - { -@@ -4423,12 +4470,13 @@ check_abbr(c, ptr, col, mincol) - /* - * Evaluate the RHS of a mapping or abbreviations and take care of escaping - * special characters. - */ - static char_u * --eval_map_expr(str) -+eval_map_expr(str, c) - char_u *str; -+ int c; /* NUL or typed character for abbreviation */ - { - char_u *res; - char_u *p; - char_u *save_cmd; - pos_T save_cursor; -@@ -4441,10 +4489,11 @@ eval_map_expr(str) - * effects. Also restore the cursor position. */ - ++textlock; - #ifdef FEAT_EX_EXTRA - ++ex_normal_lock; - #endif -+ set_vim_var_char(c); /* set v:char to the typed character */ - save_cursor = curwin->w_cursor; - p = eval_to_string(str, NULL, FALSE); - --textlock; - #ifdef FEAT_EX_EXTRA - --ex_normal_lock; -@@ -4700,11 +4749,11 @@ makemap(fd, buf) - } - if (c1 && putc(c1, fd) < 0) - return FAIL; - if (mp->m_noremap != REMAP_YES && fprintf(fd, "nore") < 0) - return FAIL; -- if (fprintf(fd, cmd) < 0) -+ if (fputs(cmd, fd) < 0) - return FAIL; - if (buf != NULL && fputs(" <buffer>", fd) < 0) - return FAIL; - if (mp->m_silent && fputs(" <silent>", fd) < 0) - return FAIL; -@@ -4799,11 +4848,11 @@ put_escstr(fd, strstart, what) - c = TO_SPECIAL(str[1], str[2]); - str += 2; - } - if (IS_SPECIAL(c) || modifiers) /* special key */ - { -- if (fprintf(fd, (char *)get_special_key_name(c, modifiers)) < 0) -+ if (fputs((char *)get_special_key_name(c, modifiers), fd) < 0) - return FAIL; - continue; - } - } - ---- vim72.orig/src/globals.h -+++ vim72/src/globals.h -@@ -480,12 +480,14 @@ EXTERN char *foreground_argument INIT(= - # endif - - /* - * While executing external commands or in Ex mode, should not insert GUI - * events in the input buffer: Set hold_gui_events to non-zero. -+ * -+ * volatile because it is used in signal handler sig_sysmouse(). - */ --EXTERN int hold_gui_events INIT(= 0); -+EXTERN volatile int hold_gui_events INIT(= 0); - - /* - * When resizing the shell is postponed, remember the new size, and call - * gui_resize_shell() later. - */ -@@ -505,10 +507,11 @@ EXTERN VimClipboard clip_plus; /* CLIPBO - # define clip_plus clip_star /* there is only one clipboard */ - # endif - EXTERN int clip_unnamed INIT(= FALSE); - EXTERN int clip_autoselect INIT(= FALSE); - EXTERN int clip_autoselectml INIT(= FALSE); -+EXTERN int clip_html INIT(= FALSE); - EXTERN regprog_T *clip_exclude_prog INIT(= NULL); - #endif - - /* - * All windows are linked in a list. firstwin points to the first entry, -@@ -520,11 +523,11 @@ EXTERN regprog_T *clip_exclude_prog INIT - EXTERN win_T *firstwin; /* first window */ - EXTERN win_T *lastwin; /* last window */ - EXTERN win_T *prevwin INIT(= NULL); /* previous window */ - # define W_NEXT(wp) ((wp)->w_next) - # define FOR_ALL_WINDOWS(wp) for (wp = firstwin; wp != NULL; wp = wp->w_next) --#define FOR_ALL_TAB_WINDOWS(tp, wp) \ -+# define FOR_ALL_TAB_WINDOWS(tp, wp) \ - for ((tp) = first_tabpage; (tp) != NULL; (tp) = (tp)->tp_next) \ - for ((wp) = ((tp) == curtab) \ - ? firstwin : (tp)->tp_firstwin; (wp); (wp) = (wp)->w_next) - #else - # define firstwin curwin -@@ -534,10 +537,15 @@ EXTERN win_T *prevwin INIT(= NULL); /* p - # define FOR_ALL_TAB_WINDOWS(tp, wp) wp = curwin; - #endif - - EXTERN win_T *curwin; /* currently active window */ - -+#ifdef FEAT_AUTOCMD -+EXTERN win_T *aucmd_win; /* window used in aucmd_prepbuf() */ -+EXTERN int aucmd_win_used INIT(= FALSE); /* aucmd_win is being used */ -+#endif -+ - /* - * The window layout is kept in a tree of frames. topframe points to the top - * of the tree. - */ - EXTERN frame_T *topframe; /* top of the window frame tree */ -@@ -595,11 +603,12 @@ EXTERN int exiting INIT(= FALSE); - * still keep on running if there is a changed - * buffer. */ - EXTERN int really_exiting INIT(= FALSE); - /* TRUE when we are sure to exit, e.g., after - * a deadly signal */ --EXTERN int full_screen INIT(= FALSE); -+/* volatile because it is used in signal handler deathtrap(). */ -+EXTERN volatile int full_screen INIT(= FALSE); - /* TRUE when doing full-screen output - * otherwise only writing some messages */ - - EXTERN int restricted INIT(= FALSE); - /* TRUE when started as "rvim" */ -@@ -614,10 +623,15 @@ EXTERN int textlock INIT(= 0); - - #ifdef FEAT_AUTOCMD - EXTERN int curbuf_lock INIT(= 0); - /* non-zero when the current buffer can't be - * changed. Used for FileChangedRO. */ -+EXTERN int allbuf_lock INIT(= 0); -+ /* non-zero when no buffer name can be -+ * changed, no buffer can be deleted and -+ * current directory can't be changed. -+ * Used for SwapExists et al. */ - #endif - #ifdef FEAT_EVAL - # define HAVE_SANDBOX - EXTERN int sandbox INIT(= 0); - /* Non-zero when evaluating an expression in a -@@ -708,11 +722,11 @@ EXTERN int can_si INIT(= FALSE); - EXTERN int can_si_back INIT(= FALSE); - #endif - - EXTERN pos_T saved_cursor /* w_cursor before formatting text. */ - # ifdef DO_INIT -- = INIT_POS_T -+ = INIT_POS_T(0, 0, 0) - # endif - ; - - /* - * Stuff for insert mode. -@@ -737,14 +751,16 @@ EXTERN JMP_BUF x_jump_env; - * Stuff for setjmp() and longjmp(). - * Used to protect areas where we could crash. - */ - EXTERN JMP_BUF lc_jump_env; /* argument to SETJMP() */ - # ifdef SIGHASARG --EXTERN int lc_signal; /* catched signal number, 0 when no was signal -- catched; used for mch_libcall() */ -+/* volatile because it is used in signal handlers. */ -+EXTERN volatile int lc_signal; /* caught signal number, 0 when no was signal -+ caught; used for mch_libcall() */ - # endif --EXTERN int lc_active INIT(= FALSE); /* TRUE when lc_jump_env is valid. */ -+/* volatile because it is used in signal handler deathtrap(). */ -+EXTERN volatile int lc_active INIT(= FALSE); /* TRUE when lc_jump_env is valid. */ - #endif - - #if defined(FEAT_MBYTE) || defined(FEAT_POSTSCRIPT) - /* - * These flags are set based upon 'fileencoding'. -@@ -798,15 +814,18 @@ EXTERN vimconv_T output_conv; /* type - * (DBCS). - * The value is set in mb_init(); - */ - /* length of char in bytes, including following composing chars */ - EXTERN int (*mb_ptr2len) __ARGS((char_u *p)) INIT(= latin_ptr2len); -+/* idem, with limit on string length */ -+EXTERN int (*mb_ptr2len_len) __ARGS((char_u *p, int size)) INIT(= latin_ptr2len_len); - /* byte length of char */ - EXTERN int (*mb_char2len) __ARGS((int c)) INIT(= latin_char2len); - /* convert char to bytes, return the length */ - EXTERN int (*mb_char2bytes) __ARGS((int c, char_u *buf)) INIT(= latin_char2bytes); - EXTERN int (*mb_ptr2cells) __ARGS((char_u *p)) INIT(= latin_ptr2cells); -+EXTERN int (*mb_ptr2cells_len) __ARGS((char_u *p, int size)) INIT(= latin_ptr2cells_len); - EXTERN int (*mb_char2cells) __ARGS((int c)) INIT(= latin_char2cells); - EXTERN int (*mb_off2cells) __ARGS((unsigned off, unsigned max_off)) INIT(= latin_off2cells); - EXTERN int (*mb_ptr2char) __ARGS((char_u *p)) INIT(= latin_ptr2char); - EXTERN int (*mb_head_off) __ARGS((char_u *base, char_u *p)) INIT(= latin_head_off); - -@@ -948,11 +967,11 @@ EXTERN struct buffheader stuffbuff /* st - = {{NULL, {NUL}}, NULL, 0, 0} - #endif - ; - EXTERN typebuf_T typebuf /* typeahead buffer */ - #ifdef DO_INIT -- = {NULL, NULL} -+ = {NULL, NULL, 0, 0, 0, 0, 0, 0, 0} - #endif - ; - #ifdef FEAT_EX_EXTRA - EXTERN int ex_normal_busy INIT(= 0); /* recursiveness of ex_normal() */ - EXTERN int ex_normal_lock INIT(= 0); /* forbid use of ex_normal() */ -@@ -984,11 +1003,12 @@ EXTERN char_u *use_viminfo INIT(= NULL); - EXTERN FILE *scriptin[NSCRIPT]; /* streams to read script from */ - EXTERN int curscript INIT(= 0); /* index in scriptin[] */ - EXTERN FILE *scriptout INIT(= NULL); /* stream to write script to */ - EXTERN int read_cmd_fd INIT(= 0); /* fd to read commands from */ - --EXTERN int got_int INIT(= FALSE); /* set to TRUE when interrupt -+/* volatile because it is used in signal handler catch_sigint(). */ -+EXTERN volatile int got_int INIT(= FALSE); /* set to TRUE when interrupt - signal occurred */ - #ifdef USE_TERM_CONSOLE - EXTERN int term_console INIT(= FALSE); /* set to TRUE when console used */ - #endif - EXTERN int termcap_active INIT(= FALSE); /* set by starttermcap() */ -@@ -1020,16 +1040,17 @@ EXTERN char_u *repeat_cmdline INIT(= NUL - #ifdef FEAT_CMDHIST - EXTERN char_u *new_last_cmdline INIT(= NULL); /* new value for last_cmdline */ - #endif - #ifdef FEAT_AUTOCMD - EXTERN char_u *autocmd_fname INIT(= NULL); /* fname for <afile> on cmdline */ -+EXTERN int autocmd_fname_full; /* autocmd_fname is full path */ - EXTERN int autocmd_bufnr INIT(= 0); /* fnum for <abuf> on cmdline */ - EXTERN char_u *autocmd_match INIT(= NULL); /* name for <amatch> on cmdline */ - EXTERN int did_cursorhold INIT(= FALSE); /* set when CursorHold t'gerd */ - EXTERN pos_T last_cursormoved /* for CursorMoved event */ - # ifdef DO_INIT -- = INIT_POS_T -+ = INIT_POS_T(0, 0, 0) - # endif - ; - #endif - - EXTERN linenr_T write_no_eol_lnum INIT(= 0); /* non-zero lnum when last line -@@ -1337,11 +1358,10 @@ EXTERN garray_T error_ga - ; - #endif - - #ifdef FEAT_NETBEANS_INTG - EXTERN char *netbeansArg INIT(= NULL); /* the -nb[:host:port:passwd] arg */ --EXTERN int netbeansCloseFile INIT(= 0); /* send killed if != 0 */ - EXTERN int netbeansFireChanges INIT(= 1); /* send buffer changes if != 0 */ - EXTERN int netbeansForcedQuit INIT(= 0);/* don't write modified files */ - EXTERN int netbeansReadFile INIT(= 1); /* OK to read from disk if != 0 */ - EXTERN int netbeansSuppressNoLines INIT(= 0); /* skip "No lines in buffer" */ - EXTERN int usingNetbeans INIT(= 0); /* set if -nb flag is used */ -@@ -1545,10 +1565,22 @@ EXTERN int xsmp_icefd INIT(= -1); /* T - #endif - - /* For undo we need to know the lowest time possible. */ - EXTERN time_t starttime; - -+#ifdef STARTUPTIME -+EXTERN FILE *time_fd INIT(= NULL); /* where to write startup timing */ -+#endif -+ -+/* -+ * Some compilers warn for not using a return value, but in some situations we -+ * can't do anything useful with the value. Assign to this variable to avoid -+ * the warning. -+ */ -+EXTERN int ignored; -+EXTERN char *ignoredp; -+ - /* - * Optional Farsi support. Include it here, so EXTERN and INIT are defined. - */ - #ifdef FEAT_FKMAP - # include "farsi.h" ---- vim72.orig/src/gui.c -+++ vim72/src/gui.c -@@ -137,11 +137,11 @@ gui_start() - else - { - /* The read returns when the child closes the pipe (or when - * the child dies for some reason). */ - close(pipefd[1]); -- (void)read(pipefd[0], &dummy, (size_t)1); -+ ignored = (int)read(pipefd[0], &dummy, (size_t)1); - close(pipefd[0]); - } - - /* When swapping screens we may need to go to the next line, e.g., - * after a hit-enter prompt and using ":gui". */ -@@ -676,15 +676,14 @@ gui_shell_closed() - * font. - * If "fontset" is TRUE, the "font_list" is used as one name for the fontset. - * Return OK when able to set the font. When it failed FAIL is returned and - * the fonts are unchanged. - */ --/*ARGSUSED*/ - int - gui_init_font(font_list, fontset) - char_u *font_list; -- int fontset; -+ int fontset UNUSED; - { - #define FONTLEN 320 - char_u font_name[FONTLEN]; - int font_list_empty = FALSE; - int ret = FAIL; -@@ -958,11 +957,11 @@ gui_update_cursor(force, clear_selection - { - static int iid; - guicolor_T fg, bg; - - if ( --# ifdef HAVE_GTK2 -+# if defined(HAVE_GTK2) && !defined(FEAT_HANGULIN) - preedit_get_status() - # else - im_get_status() - # endif - ) -@@ -1136,14 +1135,13 @@ gui_position_menu() - - /* - * Position the various GUI components (text area, menu). The vertical - * scrollbars are NOT handled here. See gui_update_scrollbars(). - */ --/*ARGSUSED*/ - static void - gui_position_components(total_width) -- int total_width; -+ int total_width UNUSED; - { - int text_area_x; - int text_area_y; - int text_area_width; - int text_area_height; -@@ -1372,14 +1370,13 @@ gui_get_shellsize() - /* - * Set the size of the Vim shell according to Rows and Columns. - * If "fit_to_display" is TRUE then the size may be reduced to fit the window - * on the screen. - */ --/*ARGSUSED*/ - void - gui_set_shellsize(mustset, fit_to_display, direction) -- int mustset; /* set by the user */ -+ int mustset UNUSED; /* set by the user */ - int fit_to_display; - int direction; /* RESIZE_HOR, RESIZE_VER */ - { - int base_width; - int base_height; -@@ -1387,10 +1384,15 @@ gui_set_shellsize(mustset, fit_to_displa - int height; - int min_width; - int min_height; - int screen_w; - int screen_h; -+#ifdef HAVE_GTK2 -+ int un_maximize = mustset; -+ int did_adjust = 0; -+#endif -+ int x = -1, y = -1; - - if (!gui.shell_created) - return; - - #ifdef MSWIN -@@ -1403,10 +1405,14 @@ gui_set_shellsize(mustset, fit_to_displa - } - #endif - - base_width = gui_get_base_width(); - base_height = gui_get_base_height(); -+ if (fit_to_display) -+ /* Remember the original window position. */ -+ gui_mch_get_winpos(&x, &y); -+ - #ifdef USE_SUN_WORKSHOP - if (!mustset && usingSunWorkShop - && workshop_get_width_height(&width, &height)) - { - Columns = (width - base_width + gui.char_width - 1) / gui.char_width; -@@ -1426,34 +1432,60 @@ gui_set_shellsize(mustset, fit_to_displa - { - Columns = (screen_w - base_width) / gui.char_width; - if (Columns < MIN_COLUMNS) - Columns = MIN_COLUMNS; - width = Columns * gui.char_width + base_width; -+#ifdef HAVE_GTK2 -+ ++did_adjust; -+#endif - } - if ((direction & RESIZE_VERT) && height > screen_h) - { - Rows = (screen_h - base_height) / gui.char_height; - check_shellsize(); - height = Rows * gui.char_height + base_height; -+#ifdef HAVE_GTK2 -+ ++did_adjust; -+#endif - } -+#ifdef HAVE_GTK2 -+ if (did_adjust == 2 || (width + gui.char_width >= screen_w -+ && height + gui.char_height >= screen_h)) -+ /* don't unmaximize if at maximum size */ -+ un_maximize = FALSE; -+#endif - } - gui.num_cols = Columns; - gui.num_rows = Rows; - - min_width = base_width + MIN_COLUMNS * gui.char_width; - min_height = base_height + MIN_LINES * gui.char_height; --# ifdef FEAT_WINDOWS -+#ifdef FEAT_WINDOWS - min_height += tabline_height() * gui.char_height; --# endif -+#endif -+ -+#ifdef HAVE_GTK2 -+ if (un_maximize) -+ { -+ /* If the window size is smaller than the screen unmaximize the -+ * window, otherwise resizing won't work. */ -+ gui_mch_get_screen_dimensions(&screen_w, &screen_h); -+ if ((width + gui.char_width < screen_w -+ || height + gui.char_height * 2 < screen_h) -+ && gui_mch_maximized()) -+ gui_mch_unmaximize(); -+ } -+#endif - - gui_mch_set_shellsize(width, height, min_width, min_height, - base_width, base_height, direction); -- if (fit_to_display) -- { -- int x, y; - -- /* Some window managers put the Vim window left of/above the screen. */ -+ if (fit_to_display && x >= 0 && y >= 0) -+ { -+ /* Some window managers put the Vim window left of/above the screen. -+ * Only change the position if it wasn't already negative before -+ * (happens on MS-Windows with a secondary monitor). */ - gui_mch_update(); - if (gui_mch_get_winpos(&x, &y) == OK && (x < 0 || y < 0)) - gui_mch_set_winpos(x < 0 ? 0 : x, y < 0 ? 0 : y); - } - -@@ -3118,14 +3150,13 @@ static int prev_which_scrollbars[3]; - /* - * Set which components are present. - * If "oldval" is not NULL, "oldval" is the previous value, the new value is - * in p_go. - */ --/*ARGSUSED*/ - void - gui_init_which_components(oldval) -- char_u *oldval; -+ char_u *oldval UNUSED; - { - #ifdef FEAT_MENU - static int prev_menu_is_active = -1; - #endif - #ifdef FEAT_TOOLBAR -@@ -3239,11 +3270,11 @@ gui_init_which_components(oldval) - /* We don't want a resize event change "Rows" here, save and - * restore it. Resizing is handled below. */ - i = Rows; - gui_update_tabline(); - Rows = i; -- need_set_size = RESIZE_VERT; -+ need_set_size |= RESIZE_VERT; - if (using_tabline) - fix_size = TRUE; - if (!gui_use_tabline()) - redraw_tabline = TRUE; /* may draw non-GUI tab line */ - } -@@ -3273,13 +3304,13 @@ gui_init_which_components(oldval) - } - } - if (gui.which_scrollbars[i] != prev_which_scrollbars[i]) - { - if (i == SBAR_BOTTOM) -- need_set_size = RESIZE_VERT; -+ need_set_size |= RESIZE_VERT; - else -- need_set_size = RESIZE_HOR; -+ need_set_size |= RESIZE_HOR; - if (gui.which_scrollbars[i]) - fix_size = TRUE; - } - } - #ifdef FEAT_WINDOWS -@@ -3295,32 +3326,32 @@ gui_init_which_components(oldval) - * restore it. Resizing is handled below. */ - i = Rows; - gui_mch_enable_menu(gui.menu_is_active); - Rows = i; - prev_menu_is_active = gui.menu_is_active; -- need_set_size = RESIZE_VERT; -+ need_set_size |= RESIZE_VERT; - if (gui.menu_is_active) - fix_size = TRUE; - } - #endif - - #ifdef FEAT_TOOLBAR - if (using_toolbar != prev_toolbar) - { - gui_mch_show_toolbar(using_toolbar); - prev_toolbar = using_toolbar; -- need_set_size = RESIZE_VERT; -+ need_set_size |= RESIZE_VERT; - if (using_toolbar) - fix_size = TRUE; - } - #endif - #ifdef FEAT_FOOTER - if (using_footer != prev_footer) - { - gui_mch_enable_footer(using_footer); - prev_footer = using_footer; -- need_set_size = RESIZE_VERT; -+ need_set_size |= RESIZE_VERT; - if (using_footer) - fix_size = TRUE; - } - #endif - #if defined(FEAT_MENU) && !defined(WIN16) && !(defined(WIN3264) && !defined(FEAT_TEAROFF)) -@@ -3328,14 +3359,15 @@ gui_init_which_components(oldval) - { - gui_mch_toggle_tearoffs(using_tearoff); - prev_tearoff = using_tearoff; - } - #endif -- if (need_set_size) -+ if (need_set_size != 0) - { - #ifdef FEAT_GUI_GTK -- long c = Columns; -+ long prev_Columns = Columns; -+ long prev_Rows = Rows; - #endif - /* Adjust the size of the window to make the text area keep the - * same size and to avoid that part of our window is off-screen - * and a scrollbar can't be used, for example. */ - gui_set_shellsize(FALSE, fix_size, need_set_size); -@@ -3347,15 +3379,18 @@ gui_init_which_components(oldval) - * change Columns and Rows when we don't want it. Wait for a - * character here to avoid this effect. - * If you remove this, please test this command for resizing - * effects (with optional left scrollbar): ":vsp|q|vsp|q|vsp|q". - * Don't do this while starting up though. -- * And don't change Rows, it may have be reduced intentionally -- * when adding menu/toolbar/tabline. */ -- if (!gui.starting) -+ * Don't change Rows when adding menu/toolbar/tabline. -+ * Don't change Columns when adding vertical toolbar. */ -+ if (!gui.starting && need_set_size != (RESIZE_VERT | RESIZE_HOR)) - (void)char_avail(); -- Columns = c; -+ if ((need_set_size & RESIZE_VERT) == 0) -+ Rows = prev_Rows; -+ if ((need_set_size & RESIZE_HOR) == 0) -+ Columns = prev_Columns; - #endif - } - #ifdef FEAT_WINDOWS - /* When the console tabline appears or disappears the window positions - * change. */ -@@ -3877,10 +3912,25 @@ gui_drag_scrollbar(sb, value, still_drag - - /* - * Scrollbar stuff: - */ - -+/* -+ * Called when something in the window layout has changed. -+ */ -+ void -+gui_may_update_scrollbars() -+{ -+ if (gui.in_use && starting == 0) -+ { -+ out_flush(); -+ gui_init_which_components(NULL); -+ gui_update_scrollbars(TRUE); -+ } -+ need_mouse_correct = TRUE; -+} -+ - void - gui_update_scrollbars(force) - int force; /* Force all scrollbars to get updated */ - { - win_T *wp; -@@ -4405,11 +4455,11 @@ gui_do_horiz_scroll() - { - /* no wrapping, no scrolling */ - if (curwin->w_p_wrap) - return FALSE; - -- if (curwin->w_leftcol == scrollbar_value) -+ if ((long_u)curwin->w_leftcol == scrollbar_value) - return FALSE; - - curwin->w_leftcol = (colnr_T)scrollbar_value; - - /* When the line of the cursor is too short, move the cursor to the -@@ -4418,11 +4468,11 @@ gui_do_horiz_scroll() - if (vim_strchr(p_go, GO_HORSCROLL) == NULL - && longest_lnum >= curwin->w_topline - && longest_lnum < curwin->w_botline - && !virtual_active()) - { -- if (scrollbar_value > scroll_line_len(curwin->w_cursor.lnum)) -+ if (scrollbar_value > (long_u)scroll_line_len(curwin->w_cursor.lnum)) - { - curwin->w_cursor.lnum = longest_lnum; - curwin->w_cursor.col = 0; - } - } -@@ -4664,15 +4714,14 @@ gui_mouse_correct() - } - - /* - * Find window where the mouse pointer "y" coordinate is in. - */ --/*ARGSUSED*/ - static win_T * - xy2win(x, y) -- int x; -- int y; -+ int x UNUSED; -+ int y UNUSED; - { - #ifdef FEAT_WINDOWS - int row; - int col; - win_T *wp; -@@ -4988,10 +5037,23 @@ gui_do_findrepl(flags, find_text, repl_t - int i; - int type = (flags & FRD_TYPE_MASK); - char_u *p; - regmatch_T regmatch; - int save_did_emsg = did_emsg; -+ static int busy = FALSE; -+ -+ /* When the screen is being updated we should not change buffers and -+ * windows structures, it may cause freed memory to be used. Also don't -+ * do this recursively (pressing "Find" quickly several times. */ -+ if (updating_screen || busy) -+ return FALSE; -+ -+ /* refuse replace when text cannot be changed */ -+ if ((type == FRD_REPLACE || type == FRD_REPLACEALL) && text_locked()) -+ return FALSE; -+ -+ busy = TRUE; - - ga_init2(&ga, 1, 100); - if (type == FRD_REPLACEALL) - ga_concat(&ga, (char_u *)"%s/"); - -@@ -5078,10 +5140,11 @@ gui_do_findrepl(flags, find_text, repl_t - msg_didout = 0; /* overwrite any message */ - need_wait_return = FALSE; /* don't wait for return */ - } - - vim_free(ga.ga_data); -+ busy = FALSE; - return (ga.ga_len > 0); - } - - #endif - -@@ -5118,15 +5181,14 @@ gui_wingoto_xy(x, y) - * Process file drop. Mouse cursor position, key modifiers, name of files - * and count of files are given. Argument "fnames[count]" has full pathnames - * of dropped files, they will be freed in this function, and caller can't use - * fnames after call this function. - */ --/*ARGSUSED*/ - void - gui_handle_drop(x, y, modifiers, fnames, count) -- int x; -- int y; -+ int x UNUSED; -+ int y UNUSED; - int_u modifiers; - char_u **fnames; - int count; - { - int i; ---- vim72.orig/src/gui_at_fs.c -+++ vim72/src/gui_at_fs.c -@@ -827,11 +827,11 @@ SFsetText(path) - text.length = strlen(path); - text.ptr = path; - text.format = FMT8BIT; - - #ifdef XtNinternational -- if (_XawTextFormat((TextWidget)selFileField) == XawFmtWide) -+ if ((unsigned long)_XawTextFormat((TextWidget)selFileField) == XawFmtWide) - { - XawTextReplace(selFileField, (XawTextPosition)0, - (XawTextPosition)WcsLen((wchar_t *)&SFtextBuffer[0]), &text); - XawTextSetInsertionPoint(selFileField, - (XawTextPosition)WcsLen((wchar_t *)&SFtextBuffer[0])); -@@ -849,21 +849,19 @@ SFsetText(path) - XawTextSetInsertionPoint(selFileField, - (XawTextPosition)strlen(SFtextBuffer)); - #endif - } - --/* ARGSUSED */ - static void - SFbuttonPressList(w, n, event) -- Widget w; -- int n; -- XButtonPressedEvent *event; -+ Widget w UNUSED; -+ int n UNUSED; -+ XButtonPressedEvent *event UNUSED; - { - SFbuttonPressed = 1; - } - --/* ARGSUSED */ - static void - SFbuttonReleaseList(w, n, event) - Widget w; - int n; - XButtonReleasedEvent *event; -@@ -987,15 +985,14 @@ SFcheckFiles(dir) - } - - return result; - } - --/* ARGSUSED */ - static void - SFdirModTimer(cl, id) -- XtPointer cl; -- XtIntervalId *id; -+ XtPointer cl UNUSED; -+ XtIntervalId *id UNUSED; - { - static int n = -1; - static int f = 0; - char save; - SFDir *dir; -@@ -1594,15 +1591,14 @@ SFscrollTimerInterval() - return (unsigned long)t; - } - - static void SFscrollTimer __ARGS((XtPointer p, XtIntervalId *id)); - --/* ARGSUSED */ - static void - SFscrollTimer(p, id) - XtPointer p; -- XtIntervalId *id; -+ XtIntervalId *id UNUSED; - { - SFDir *dir; - int save; - int n; - -@@ -1693,14 +1689,13 @@ SFnewInvertEntry(n, event) - } - return -1; - } - } - --/* ARGSUSED */ - static void - SFenterList(w, n, event) -- Widget w; -+ Widget w UNUSED; - int n; - XEnterWindowEvent *event; - { - int nw; - -@@ -1717,28 +1712,26 @@ SFenterList(w, n, event) - SFcurrentInvert[n] = nw; - SFinvertEntry(n); - } - } - --/* ARGSUSED */ - static void - SFleaveList(w, n, event) -- Widget w; -+ Widget w UNUSED; - int n; -- XEvent *event; -+ XEvent *event UNUSED; - { - if (SFcurrentInvert[n] != -1) - { - SFinvertEntry(n); - SFcurrentInvert[n] = -1; - } - } - --/* ARGSUSED */ - static void - SFmotionList(w, n, event) -- Widget w; -+ Widget w UNUSED; - int n; - XMotionEvent *event; - { - int nw; - -@@ -1752,11 +1745,10 @@ SFmotionList(w, n, event) - if (nw != -1) - SFinvertEntry(n); - } - } - --/* ARGSUSED */ - static void - SFvFloatSliderMovedCallback(w, n, fnew) - Widget w; - XtPointer n; - XtPointer fnew; -@@ -1765,14 +1757,13 @@ SFvFloatSliderMovedCallback(w, n, fnew) - - nw = (*(float *)fnew) * SFdirs[SFdirPtr + (int)(long)n].nEntries; - SFvSliderMovedCallback(w, (int)(long)n, nw); - } - --/* ARGSUSED */ - static void - SFvSliderMovedCallback(w, n, nw) -- Widget w; -+ Widget w UNUSED; - int n; - int nw; - { - int old; - Window win; -@@ -1851,14 +1842,13 @@ SFvSliderMovedCallback(w, n, nw) - False); - SFdrawStrings(win, dir, 0, SFlistSize - 1); - } - } - --/* ARGSUSED */ - static void - SFvAreaSelectedCallback(w, n, pnew) -- Widget w; -+ Widget w; - XtPointer n; - XtPointer pnew; - { - SFDir *dir; - int nw = (int)(long)pnew; -@@ -1912,14 +1902,13 @@ SFvAreaSelectedCallback(w, n, pnew) - } - - SFvSliderMovedCallback(w, (int)(long)n, nw); - } - --/* ARGSUSED */ - static void - SFhSliderMovedCallback(w, n, nw) -- Widget w; -+ Widget w UNUSED; - XtPointer n; - XtPointer nw; - { - SFDir *dir; - int save; -@@ -1931,14 +1920,13 @@ SFhSliderMovedCallback(w, n, nw) - return; - - SFdrawList((int)(long)n, SF_DO_NOT_SCROLL); - } - --/* ARGSUSED */ - static void - SFhAreaSelectedCallback(w, n, pnew) -- Widget w; -+ Widget w; - XtPointer n; - XtPointer pnew; - { - SFDir *dir; - int nw = (int)(long)pnew; -@@ -1992,15 +1980,14 @@ SFhAreaSelectedCallback(w, n, pnew) - - SFhSliderMovedCallback(w, n, (XtPointer)&f); - } - } - --/* ARGSUSED */ - static void - SFpathSliderMovedCallback(w, client_data, nw) -- Widget w; -- XtPointer client_data; -+ Widget w UNUSED; -+ XtPointer client_data UNUSED; - XtPointer nw; - { - SFDir *dir; - int n; - XawTextPosition pos; -@@ -2029,15 +2016,14 @@ SFpathSliderMovedCallback(w, client_data - } - - XawTextSetInsertionPoint(selFileField, pos); - } - --/* ARGSUSED */ - static void - SFpathAreaSelectedCallback(w, client_data, pnew) - Widget w; -- XtPointer client_data; -+ XtPointer client_data UNUSED; - XtPointer pnew; - { - int nw = (int)(long)pnew; - float f; - -@@ -2204,33 +2190,31 @@ static char *oneLineTextEditTranslations - Ctrl<Key>M: redraw-display()\n\ - "; - - static void SFexposeList __ARGS((Widget w, XtPointer n, XEvent *event, Boolean *cont)); - --/* ARGSUSED */ - static void - SFexposeList(w, n, event, cont) -- Widget w; -+ Widget w UNUSED; - XtPointer n; - XEvent *event; -- Boolean *cont; -+ Boolean *cont UNUSED; - { - if ((event->type == NoExpose) || event->xexpose.count) - return; - - SFdrawList((int)(long)n, SF_DO_NOT_SCROLL); - } - - static void SFmodVerifyCallback __ARGS((Widget w, XtPointer client_data, XEvent *event, Boolean *cont)); - --/* ARGSUSED */ - static void - SFmodVerifyCallback(w, client_data, event, cont) -- Widget w; -- XtPointer client_data; -+ Widget w UNUSED; -+ XtPointer client_data UNUSED; - XEvent *event; -- Boolean *cont; -+ Boolean *cont UNUSED; - { - char buf[2]; - - if ((XLookupString(&(event->xkey), buf, 2, NULL, NULL) == 1) && - ((*buf) == '\r')) -@@ -2239,15 +2223,15 @@ SFmodVerifyCallback(w, client_data, even - SFstatus = SEL_FILE_TEXT; - } - - static void SFokCallback __ARGS((Widget w, XtPointer cl, XtPointer cd)); - --/* ARGSUSED */ - static void - SFokCallback(w, cl, cd) -- Widget w; -- XtPointer cl, cd; -+ Widget w UNUSED; -+ XtPointer cl UNUSED; -+ XtPointer cd UNUSED; - { - SFstatus = SEL_FILE_OK; - } - - static XtCallbackRec SFokSelect[] = -@@ -2256,15 +2240,15 @@ static XtCallbackRec SFokSelect[] = - { NULL, (XtPointer) NULL }, - }; - - static void SFcancelCallback __ARGS((Widget w, XtPointer cl, XtPointer cd)); - --/* ARGSUSED */ - static void - SFcancelCallback(w, cl, cd) -- Widget w; -- XtPointer cl, cd; -+ Widget w UNUSED; -+ XtPointer cl UNUSED; -+ XtPointer cd UNUSED; - { - SFstatus = SEL_FILE_CANCEL; - } - - static XtCallbackRec SFcancelSelect[] = -@@ -2273,20 +2257,19 @@ static XtCallbackRec SFcancelSelect[] = - { NULL, (XtPointer) NULL }, - }; - - static void SFdismissAction __ARGS((Widget w, XEvent *event, String *params, Cardinal *num_params)); - --/* ARGSUSED */ - static void - SFdismissAction(w, event, params, num_params) -- Widget w; -- XEvent *event; -- String *params; -- Cardinal *num_params; -+ Widget w UNUSED; -+ XEvent *event; -+ String *params UNUSED; -+ Cardinal *num_params UNUSED; - { -- if (event->type == ClientMessage && -- event->xclient.data.l[0] != SFwmDeleteWindow) -+ if (event->type == ClientMessage -+ && (Atom)event->xclient.data.l[0] != SFwmDeleteWindow) - return; - - SFstatus = SEL_FILE_CANCEL; - } - -@@ -2701,11 +2684,11 @@ SFcreateWidgets(toplevel, prompt, ok, ca - - static void - SFtextChanged() - { - #if defined(FEAT_XFONTSET) && defined(XtNinternational) -- if (_XawTextFormat((TextWidget)selFileField) == XawFmtWide) -+ if ((unsigned long)_XawTextFormat((TextWidget)selFileField) == XawFmtWide) - { - wchar_t *wcbuf=(wchar_t *)SFtextBuffer; - - if ((wcbuf[0] == L'/') || (wcbuf[0] == L'~')) - { -@@ -2747,11 +2730,11 @@ SFtextChanged() - SFgetText() - { - #if defined(FEAT_XFONTSET) && defined(XtNinternational) - char *buf; - -- if (_XawTextFormat((TextWidget)selFileField) == XawFmtWide) -+ if ((unsigned long)_XawTextFormat((TextWidget)selFileField) == XawFmtWide) - { - wchar_t *wcbuf; - int mbslength; - - XtVaGetValues(selFileField, ---- vim72.orig/src/gui_at_sb.c -+++ vim72/src/gui_at_sb.c -@@ -196,14 +196,17 @@ ScrollbarClassRec vim_scrollbarClassRec - /* query_geometry */ XtInheritQueryGeometry, - /* display_accelerator*/ XtInheritDisplayAccelerator, - /* extension */ NULL - }, - { /* simple fields */ -- /* change_sensitive */ XtInheritChangeSensitive -+ /* change_sensitive */ XtInheritChangeSensitive, -+#ifndef OLDXAW -+ /* extension */ NULL -+#endif - }, - { /* scrollbar fields */ -- /* ignore */ 0 -+ /* empty */ 0 - } - }; - - WidgetClass vim_scrollbarWidgetClass = (WidgetClass)&vim_scrollbarClassRec; - -@@ -239,11 +242,12 @@ FillArea(sbw, top, bottom, fill, draw_sh - int sw, margin, floor; - int lx, ly, lw, lh; - - if (bottom <= 0 || bottom <= top) - return; -- if ((sw = sbw->scrollbar.shadow_width) < 0) -+ sw = sbw->scrollbar.shadow_width; -+ if (sw < 0) - sw = 0; - margin = MARGIN (sbw); - floor = sbw->scrollbar.length - margin + 2; - - if (sbw->scrollbar.orientation == XtorientHorizontal) -@@ -514,17 +518,16 @@ SetDimensions(sbw) - sbw->scrollbar.length = sbw->core.width; - sbw->scrollbar.thickness = sbw->core.height; - } - } - --/* ARGSUSED */ - static void - Initialize(request, new, args, num_args) -- Widget request; /* what the client asked for */ -+ Widget request UNUSED; /* what the client asked for */ - Widget new; /* what we're going to give him */ -- ArgList args; -- Cardinal *num_args; -+ ArgList args UNUSED; -+ Cardinal *num_args UNUSED; - { - ScrollbarWidget sbw = (ScrollbarWidget) new; - - CreateGC(new); - AllocTopShadowGC(new); -@@ -554,18 +557,17 @@ Realize(w, valueMask, attributes) - /* The Simple widget actually stuffs the value in the valuemask. */ - (*vim_scrollbarWidgetClass->core_class.superclass->core_class.realize) - (w, valueMask, attributes); - } - --/* ARGSUSED */ - static Boolean - SetValues(current, request, desired, args, num_args) -- Widget current, /* what I am */ -- request, /* what he wants me to be */ -- desired; /* what I will become */ -- ArgList args; -- Cardinal *num_args; -+ Widget current; /* what I am */ -+ Widget request UNUSED; /* what he wants me to be */ -+ Widget desired; /* what I will become */ -+ ArgList args UNUSED; -+ Cardinal *num_args UNUSED; - { - ScrollbarWidget sbw = (ScrollbarWidget) current; - ScrollbarWidget dsbw = (ScrollbarWidget) desired; - Boolean redraw = FALSE; - -@@ -607,11 +609,10 @@ Resize(w) - SetDimensions ((ScrollbarWidget) w); - Redisplay(w, (XEvent*) NULL, (Region)NULL); - } - - --/* ARGSUSED */ - static void - Redisplay(w, event, region) - Widget w; - XEvent *event; - Region region; -@@ -787,15 +788,14 @@ HandleThumb(w, event, params, num_params - XtCallActionProc(w, "MoveThumb", event, params, *num_params); - XtCallActionProc(w, "NotifyThumb", event, params, *num_params); - } - } - --/* ARGSUSED */ - static void - RepeatNotify(client_data, idp) - XtPointer client_data; -- XtIntervalId *idp; -+ XtIntervalId *idp UNUSED; - { - ScrollbarWidget sbw = (ScrollbarWidget) client_data; - int call_data; - char mode = sbw->scrollbar.scroll_mode; - unsigned long rep; -@@ -837,50 +837,46 @@ FloatInRange(num, small, big) - float num, small, big; - { - return (num < small) ? small : ((num > big) ? big : num); - } - --/* ARGSUSED */ - static void - ScrollOneLineUp(w, event, params, num_params) - Widget w; - XEvent *event; -- String *params; -- Cardinal *num_params; -+ String *params UNUSED; -+ Cardinal *num_params UNUSED; - { - ScrollSome(w, event, -ONE_LINE_DATA); - } - --/* ARGSUSED */ - static void - ScrollOneLineDown(w, event, params, num_params) - Widget w; - XEvent *event; -- String *params; -- Cardinal *num_params; -+ String *params UNUSED; -+ Cardinal *num_params UNUSED; - { - ScrollSome(w, event, ONE_LINE_DATA); - } - --/* ARGSUSED */ - static void - ScrollPageDown(w, event, params, num_params) - Widget w; - XEvent *event; -- String *params; -- Cardinal *num_params; -+ String *params UNUSED; -+ Cardinal *num_params UNUSED; - { - ScrollSome(w, event, ONE_PAGE_DATA); - } - --/* ARGSUSED */ - static void - ScrollPageUp(w, event, params, num_params) - Widget w; - XEvent *event; -- String *params; -- Cardinal *num_params; -+ String *params UNUSED; -+ Cardinal *num_params UNUSED; - { - ScrollSome(w, event, -ONE_PAGE_DATA); - } - - static void -@@ -899,17 +895,16 @@ ScrollSome(w, event, call_data) - - sbw->scrollbar.scroll_mode = SMODE_LINE_UP; - XtCallCallbacks(w, XtNscrollProc, (XtPointer)call_data); - } - --/* ARGSUSED */ - static void - NotifyScroll(w, event, params, num_params) - Widget w; - XEvent *event; -- String *params; -- Cardinal *num_params; -+ String *params UNUSED; -+ Cardinal *num_params UNUSED; - { - ScrollbarWidget sbw = (ScrollbarWidget) w; - Position x, y, loc; - Dimension arrow_size; - unsigned long delay = 0; -@@ -989,17 +984,16 @@ NotifyScroll(w, event, params, num_param - sbw->scrollbar.timer_id = - XtAppAddTimeOut(XtWidgetToApplicationContext(w), - delay, RepeatNotify, (XtPointer)w); - } - --/* ARGSUSED */ - static void - EndScroll(w, event, params, num_params) - Widget w; -- XEvent *event; /* unused */ -- String *params; /* unused */ -- Cardinal *num_params; /* unused */ -+ XEvent *event UNUSED; -+ String *params UNUSED; -+ Cardinal *num_params UNUSED; - { - ScrollbarWidget sbw = (ScrollbarWidget) w; - - sbw->scrollbar.scroll_mode = SMODE_NONE; - /* no need to remove any autoscroll timeout; it will no-op */ -@@ -1021,17 +1015,16 @@ FractionLoc(sbw, x, y) - height = (float)sbw->core.height - 2 * margin; - width = (float)sbw->core.width - 2 * margin; - return PICKLENGTH(sbw, x / width, y / height); - } - --/* ARGSUSED */ - static void - MoveThumb(w, event, params, num_params) - Widget w; - XEvent *event; -- String *params; /* unused */ -- Cardinal *num_params; /* unused */ -+ String *params UNUSED; -+ Cardinal *num_params UNUSED; - { - ScrollbarWidget sbw = (ScrollbarWidget)w; - Position x, y; - float top; - char old_mode = sbw->scrollbar.scroll_mode; -@@ -1067,31 +1060,36 @@ MoveThumb(w, event, params, num_params) - PaintThumb(sbw); - XFlush(XtDisplay(w)); /* re-draw it before Notifying */ - } - - --/* ARGSUSED */ - static void - NotifyThumb(w, event, params, num_params) - Widget w; - XEvent *event; -- String *params; /* unused */ -- Cardinal *num_params; /* unused */ -+ String *params UNUSED; -+ Cardinal *num_params UNUSED; - { - ScrollbarWidget sbw = (ScrollbarWidget)w; -+ /* Use a union to avoid a warning for the weird conversion from float to -+ * XtPointer. Comes from Xaw/Scrollbar.c. */ -+ union { -+ XtPointer xtp; -+ float xtf; -+ } xtpf; - - if (LookAhead(w, event)) - return; - - /* thumbProc is not pretty, but is necessary for backwards - compatibility on those architectures for which it work{s,ed}; - the intent is to pass a (truncated) float by value. */ -- XtCallCallbacks(w, XtNthumbProc, *(XtPointer*)&sbw->scrollbar.top); -+ xtpf.xtf = sbw->scrollbar.top; -+ XtCallCallbacks(w, XtNthumbProc, xtpf.xtp); - XtCallCallbacks(w, XtNjumpProc, (XtPointer)&sbw->scrollbar.top); - } - --/* ARGSUSED */ - static void - AllocTopShadowGC(w) - Widget w; - { - ScrollbarWidget sbw = (ScrollbarWidget) w; -@@ -1101,11 +1099,10 @@ AllocTopShadowGC(w) - valuemask = GCForeground; - myXGCV.foreground = sbw->scrollbar.top_shadow_pixel; - sbw->scrollbar.top_shadow_GC = XtGetGC(w, valuemask, &myXGCV); - } - --/* ARGSUSED */ - static void - AllocBotShadowGC(w) - Widget w; - { - ScrollbarWidget sbw = (ScrollbarWidget) w; -@@ -1115,15 +1112,14 @@ AllocBotShadowGC(w) - valuemask = GCForeground; - myXGCV.foreground = sbw->scrollbar.bot_shadow_pixel; - sbw->scrollbar.bot_shadow_GC = XtGetGC(w, valuemask, &myXGCV); - } - --/* ARGSUSED */ - static void - _Xaw3dDrawShadows(gw, event, region, out) - Widget gw; -- XEvent *event; -+ XEvent *event UNUSED; - Region region; - int out; - { - XPoint pt[6]; - ScrollbarWidget sbw = (ScrollbarWidget) gw; ---- vim72.orig/src/gui_athena.c -+++ vim72/src/gui_athena.c -@@ -84,14 +84,13 @@ static int puller_width = 0; - - /* - * Scrollbar callback (XtNjumpProc) for when the scrollbar is dragged with the - * left or middle mouse button. - */ --/* ARGSUSED */ - static void - gui_athena_scroll_cb_jump(w, client_data, call_data) -- Widget w; -+ Widget w UNUSED; - XtPointer client_data, call_data; - { - scrollbar_T *sb, *sb_info; - long value; - -@@ -120,14 +119,13 @@ gui_athena_scroll_cb_jump(w, client_data - - /* - * Scrollbar callback (XtNscrollProc) for paging up or down with the left or - * right mouse buttons. - */ --/* ARGSUSED */ - static void - gui_athena_scroll_cb_scroll(w, client_data, call_data) -- Widget w; -+ Widget w UNUSED; - XtPointer client_data, call_data; - { - scrollbar_T *sb, *sb_info; - long value; - int data = (int)(long)call_data; -@@ -490,11 +488,11 @@ get_toolbar_pixmap(menu, sen) - } - - if (menu->icon_builtin || gui_find_bitmap(menu->name, buf, "xpm") == FAIL) - { - if (menu->iconidx >= 0 && menu->iconidx -- < (sizeof(built_in_pixmaps) / sizeof(built_in_pixmaps[0]))) -+ < (int)(sizeof(built_in_pixmaps) / sizeof(built_in_pixmaps[0]))) - xpm = built_in_pixmaps[menu->iconidx]; - else - xpm = tb_blank_xpm; - } - -@@ -761,11 +759,11 @@ athena_calculate_ins_pos(widget) - XtSetArg(args[n], XtNchildren, &children); n++; - XtSetArg(args[n], XtNnumChildren, &num_children); n++; - XtGetValues(XtParent(widget), args, n); - - retval = num_children; -- for (i = 0; i < num_children; ++i) -+ for (i = 0; i < (int)num_children; ++i) - { - Widget current = children[i]; - vimmenu_T *menu = NULL; - - for (menu = (a_cur_menu->parent == NULL) -@@ -778,15 +776,14 @@ athena_calculate_ins_pos(widget) - retval = i; - } - return retval; - } - --/* ARGSUSED */ - void - gui_mch_add_menu(menu, idx) - vimmenu_T *menu; -- int idx; -+ int idx UNUSED; - { - char_u *pullright_name; - Dimension height, space, border; - vimmenu_T *parent = menu->parent; - -@@ -867,11 +864,11 @@ gui_mch_add_menu(menu, idx) - int i; - - XtVaGetValues(parent->submenu_id, XtNchildren, &children, - XtNnumChildren, &num_children, - NULL); -- for (i = 0; i < num_children; ++i) -+ for (i = 0; i < (int)num_children; ++i) - { - XtVaSetValues(children[i], - XtNrightMargin, puller_width, - NULL); - } -@@ -911,11 +908,11 @@ gui_athena_menu_has_submenus(id, ignore) - int i; - - XtVaGetValues(id, XtNchildren, &children, - XtNnumChildren, &num_children, - NULL); -- for (i = 0; i < num_children; ++i) -+ for (i = 0; i < (int)num_children; ++i) - { - if (children[i] == ignore) - continue; - if (has_submenu(children[i])) - return True; -@@ -1173,15 +1170,14 @@ make_pull_name(name) - *p = '_'; - } - return pname; - } - --/* ARGSUSED */ - void - gui_mch_add_menu_item(menu, idx) - vimmenu_T *menu; -- int idx; -+ int idx UNUSED; - { - vimmenu_T *parent = menu->parent; - - a_cur_menu = menu; - # ifdef FEAT_TOOLBAR -@@ -1442,11 +1438,11 @@ gui_mch_compute_toolbar_height() - XtNborderWidth, &shadowThickness, - XtNvSpace, &marginHeight, - XtNchildren, &children, - XtNnumChildren, &numChildren, - NULL); -- for (i = 0; i < numChildren; i++) -+ for (i = 0; i < (int)numChildren; i++) - { - whgt = 0; - - XtVaGetValues(children[i], XtNheight, &whgt, NULL); - if (height < whgt) -@@ -1471,14 +1467,13 @@ gui_mch_get_toolbar_colors(bgp, fgp, bsp - *hsp = *tsp; - } - #endif - - --/* ARGSUSED */ - void - gui_mch_toggle_tearoffs(enable) -- int enable; -+ int enable UNUSED; - { - /* no tearoff menus */ - } - - void -@@ -1535,11 +1530,11 @@ gui_mch_destroy_menu(menu) - if (gui_athena_menu_has_submenus(parent, menu->id)) - right_margin = puller_width; - else - get_left_margin = True; - -- for (i = 0; i < num_children; ++i) -+ for (i = 0; i < (int)num_children; ++i) - { - if (children[i] == menu->id) - continue; - if (get_left_margin == True) - { -@@ -1643,15 +1638,14 @@ gui_mch_destroy_menu(menu) - XtDestroyWidget(menu->submenu_id); - menu->submenu_id = (Widget)0; - } - } - --/*ARGSUSED*/ - static void - gui_athena_menu_timeout(client_data, id) - XtPointer client_data; -- XtIntervalId *id; -+ XtIntervalId *id UNUSED; - { - Widget w = (Widget)client_data; - Widget popup; - - timer = 0; -@@ -1676,16 +1670,15 @@ gui_athena_menu_timeout(client_data, id) - * up. It should appear even with and just slightly to the left of the - * rightmost end of the menu entry that caused the popup. - * - * This is called when XtPopup() is called. - */ --/*ARGSUSED*/ - static void - gui_athena_popup_callback(w, client_data, call_data) - Widget w; - XtPointer client_data; -- XtPointer call_data; -+ XtPointer call_data UNUSED; - { - /* Assumption: XtIsSubclass(XtParent(w),simpleMenuWidgetClass) */ - vimmenu_T *menu = (vimmenu_T *)client_data; - Dimension width; - Position root_x, root_y; -@@ -1709,11 +1702,10 @@ gui_athena_popup_callback(w, client_data - XtVaSetValues(w, XtNx, root_x, - XtNy, root_y, - NULL); - } - --/* ARGSUSED */ - static void - gui_athena_popdown_submenus_action(w, event, args, nargs) - Widget w; - XEvent *event; - String *args; -@@ -1754,11 +1746,10 @@ has_submenu(widget) - return True; - } - return False; - } - --/* ARGSUSED */ - static void - gui_athena_delayed_arm_action(w, event, args, nargs) - Widget w; - XEvent *event; - String *args; -@@ -1835,11 +1826,10 @@ submenu_widget(widget) - return popup; - /* Postcondition: (popup != NULL) implies - * (XtIsSubclass(popup,simpleMenuWidgetClass) == True) */ - } - --/* ARGSUSED */ - void - gui_mch_show_popupmenu(menu) - vimmenu_T *menu; - { - int rootx, rooty, winx, winy; -@@ -2044,19 +2034,18 @@ gui_x11_get_wid() - #if defined(FEAT_BROWSE) || defined(PROTO) - /* - * Put up a file requester. - * Returns the selected name in allocated memory, or NULL for Cancel. - */ --/* ARGSUSED */ - char_u * - gui_mch_browse(saving, title, dflt, ext, initdir, filter) -- int saving; /* select file to write */ -- char_u *title; /* not used (title for the window) */ -- char_u *dflt; /* not used (default name) */ -- char_u *ext; /* not used (extension added) */ -+ int saving UNUSED; /* select file to write */ -+ char_u *title; /* title for the window */ -+ char_u *dflt; /* default name */ -+ char_u *ext UNUSED; /* extension added */ - char_u *initdir; /* initial directory, NULL for current dir */ -- char_u *filter; /* not used (file name filter) */ -+ char_u *filter UNUSED; /* file name filter */ - { - Position x, y; - char_u dirbuf[MAXPATHL]; - - /* Concatenate "initdir" and "dflt". */ -@@ -2098,17 +2087,16 @@ static void dialog_wm_handler __ARGS((Wi - - /* - * Callback function for the textfield. When CR is hit this works like - * hitting the "OK" button, ESC like "Cancel". - */ --/* ARGSUSED */ - static void - keyhit_callback(w, client_data, event, cont) -- Widget w; -- XtPointer client_data; -+ Widget w UNUSED; -+ XtPointer client_data UNUSED; - XEvent *event; -- Boolean *cont; -+ Boolean *cont UNUSED; - { - char buf[2]; - - if (XLookupString(&(event->xkey), buf, 2, NULL, NULL) == 1) - { -@@ -2117,44 +2105,41 @@ keyhit_callback(w, client_data, event, c - else if (*buf == ESC) - dialogStatus = 0; - } - } - --/* ARGSUSED */ - static void - butproc(w, client_data, call_data) -- Widget w; -+ Widget w UNUSED; - XtPointer client_data; -- XtPointer call_data; -+ XtPointer call_data UNUSED; - { - dialogStatus = (int)(long)client_data + 1; - } - - /* - * Function called when dialog window closed. - */ --/*ARGSUSED*/ - static void - dialog_wm_handler(w, client_data, event, dum) -- Widget w; -- XtPointer client_data; -+ Widget w UNUSED; -+ XtPointer client_data UNUSED; - XEvent *event; -- Boolean *dum; -+ Boolean *dum UNUSED; - { - if (event->type == ClientMessage -- && ((XClientMessageEvent *)event)->data.l[0] == dialogatom) -+ && (Atom)((XClientMessageEvent *)event)->data.l[0] == dialogatom) - dialogStatus = 0; - } - --/* ARGSUSED */ - int - gui_mch_dialog(type, title, message, buttons, dfltbutton, textfield) -- int type; -+ int type UNUSED; - char_u *title; - char_u *message; - char_u *buttons; -- int dfltbutton; -+ int dfltbutton UNUSED; - char_u *textfield; - { - char_u *buts; - char_u *p, *next; - XtAppContext app; ---- vim72.orig/src/gui_beval.c -+++ vim72/src/gui_beval.c -@@ -13,15 +13,14 @@ - #if defined(FEAT_BEVAL) || defined(PROTO) - - /* - * Common code, invoked when the mouse is resting for a moment. - */ --/*ARGSUSED*/ - void - general_beval_cb(beval, state) - BalloonEval *beval; -- int state; -+ int state UNUSED; - { - win_T *wp; - int col; - int use_sandbox; - linenr_T lnum; -@@ -549,13 +548,12 @@ target_event_cb(GtkWidget *widget, GdkEv - } - - return FALSE; /* continue emission */ - } - --/*ARGSUSED*/ - static gint --mainwin_event_cb(GtkWidget *widget, GdkEvent *event, gpointer data) -+mainwin_event_cb(GtkWidget *widget UNUSED, GdkEvent *event, gpointer data) - { - BalloonEval *beval = (BalloonEval *)data; - - switch (event->type) - { -@@ -661,24 +659,24 @@ timeout_cb(gpointer data) - requestBalloon(beval); - - return FALSE; /* don't call me again */ - } - --/*ARGSUSED2*/ - static gint --balloon_expose_event_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data) -+balloon_expose_event_cb(GtkWidget *widget, -+ GdkEventExpose *event, -+ gpointer data UNUSED) - { - gtk_paint_flat_box(widget->style, widget->window, - GTK_STATE_NORMAL, GTK_SHADOW_OUT, - &event->area, widget, "tooltip", - 0, 0, -1, -1); - - return FALSE; /* continue emission */ - } - - # ifndef HAVE_GTK2 --/*ARGSUSED2*/ - static void - balloon_draw_cb(GtkWidget *widget, GdkRectangle *area, gpointer data) - { - GtkWidget *child; - GdkRectangle child_area; -@@ -724,17 +722,16 @@ removeEventHandler(beval) - - - /* - * The X event handler. All it does is call the real event handler. - */ --/*ARGSUSED*/ - static void - pointerEventEH(w, client_data, event, unused) -- Widget w; -+ Widget w UNUSED; - XtPointer client_data; - XEvent *event; -- Boolean *unused; -+ Boolean *unused UNUSED; - { - BalloonEval *beval = (BalloonEval *)client_data; - pointerEvent(beval, event); - } - -@@ -875,15 +872,14 @@ pointerEvent(beval, event) - default: - break; - } - } - --/*ARGSUSED*/ - static void - timerRoutine(dx, id) - XtPointer dx; -- XtIntervalId *id; -+ XtIntervalId *id UNUSED; - { - BalloonEval *beval = (BalloonEval *)dx; - - beval->timerID = (XtIntervalId)NULL; - -@@ -1289,10 +1285,27 @@ drawBalloon(beval) - XtVaSetValues(beval->balloonShell, - XtNx, tx, - XtNy, ty, - NULL); - #endif -+ /* Set tooltip colors */ -+ { -+ Arg args[2]; -+ -+#ifdef FEAT_GUI_MOTIF -+ args[0].name = XmNbackground; -+ args[0].value = gui.tooltip_bg_pixel; -+ args[1].name = XmNforeground; -+ args[1].value = gui.tooltip_fg_pixel; -+#else /* Athena */ -+ args[0].name = XtNbackground; -+ args[0].value = gui.tooltip_bg_pixel; -+ args[1].name = XtNforeground; -+ args[1].value = gui.tooltip_fg_pixel; -+#endif -+ XtSetValues(beval->balloonLabel, &args[0], XtNumber(args)); -+ } - - XtPopup(beval->balloonShell, XtGrabNone); - - beval->showState = ShS_SHOWING; - ---- vim72.orig/src/gui_gtk.c -+++ vim72/src/gui_gtk.c -@@ -283,18 +283,18 @@ create_menu_icon(vimmenu_T *menu, GtkIco - } - - return image; - } - --/*ARGSUSED*/ - static gint --toolbar_button_focus_in_event(GtkWidget *widget, GdkEventFocus *event, gpointer data) --{ -- /* When we're in a GtkPlug, we don't have window focus events, only widget focus. -- * To emulate stand-alone gvim, if a button gets focus (e.g., <Tab> into GtkPlug) -- * immediately pass it to mainwin. -- */ -+toolbar_button_focus_in_event(GtkWidget *widget UNUSED, -+ GdkEventFocus *event UNUSED, -+ gpointer data UNUSED) -+{ -+ /* When we're in a GtkPlug, we don't have window focus events, only widget -+ * focus. To emulate stand-alone gvim, if a button gets focus (e.g., -+ * <Tab> into GtkPlug) immediately pass it to mainwin. */ - if (gtk_socket_id != 0) - gtk_widget_grab_focus(gui.drawarea); - - return TRUE; - } -@@ -583,13 +583,12 @@ gui_mch_add_menu(vimmenu_T *menu, int id - if (vim_strchr(p_go, GO_TEAROFF) != NULL) - gtk_widget_show(menu->tearoff_handle); - gtk_menu_prepend(GTK_MENU(menu->submenu_id), menu->tearoff_handle); - } - --/*ARGSUSED*/ - static void --menu_item_activate(GtkWidget *widget, gpointer data) -+menu_item_activate(GtkWidget *widget UNUSED, gpointer data) - { - gui_menu_cb((vimmenu_T *)data); - - # ifndef HAVE_GTK2 - /* Work around a bug in GTK+ 1: we don't seem to get a focus-in -@@ -1200,13 +1199,12 @@ gui_mch_destroy_scrollbar(scrollbar_T *s - * on just about any event. */ - /* # define USE_FILE_CHOOSER */ - #endif - - #ifndef USE_FILE_CHOOSER --/*ARGSUSED*/ - static void --browse_ok_cb(GtkWidget *widget, gpointer cbdata) -+browse_ok_cb(GtkWidget *widget UNUSED, gpointer cbdata) - { - gui_T *vw = (gui_T *)cbdata; - - if (vw->browse_fname != NULL) - g_free(vw->browse_fname); -@@ -1216,13 +1214,12 @@ browse_ok_cb(GtkWidget *widget, gpointer - gtk_widget_hide(vw->filedlg); - if (gtk_main_level() > 0) - gtk_main_quit(); - } - --/*ARGSUSED*/ - static void --browse_cancel_cb(GtkWidget *widget, gpointer cbdata) -+browse_cancel_cb(GtkWidget *widget UNUSED, gpointer cbdata) - { - gui_T *vw = (gui_T *)cbdata; - - if (vw->browse_fname != NULL) - { -@@ -1232,13 +1229,12 @@ browse_cancel_cb(GtkWidget *widget, gpoi - gtk_widget_hide(vw->filedlg); - if (gtk_main_level() > 0) - gtk_main_quit(); - } - --/*ARGSUSED*/ - static gboolean --browse_destroy_cb(GtkWidget * widget) -+browse_destroy_cb(GtkWidget *widget UNUSED) - { - if (gui.browse_fname != NULL) - { - g_free(gui.browse_fname); - gui.browse_fname = NULL; -@@ -1260,18 +1256,17 @@ browse_destroy_cb(GtkWidget * widget) - * dflt default name - * ext not used (extension added) - * initdir initial directory, NULL for current dir - * filter not used (file name filter) - */ --/*ARGSUSED*/ - char_u * --gui_mch_browse(int saving, -+gui_mch_browse(int saving UNUSED, - char_u *title, - char_u *dflt, -- char_u *ext, -+ char_u *ext UNUSED, - char_u *initdir, -- char_u *filter) -+ char_u *filter UNUSED) - { - #ifdef USE_FILE_CHOOSER - GtkWidget *fc; - #endif - char_u dirbuf[MAXPATHL]; -@@ -1375,11 +1370,10 @@ gui_mch_browse(int saving, - * Returns the selected name in allocated memory, or NULL for Cancel. - * title title for the window - * dflt default name - * initdir initial directory, NULL for current dir - */ --/*ARGSUSED*/ - char_u * - gui_mch_browsedir( - char_u *title, - char_u *initdir) - { -@@ -1458,11 +1452,10 @@ dlg_destroy(GtkWidget *dlg) - /* Destroy the dialog, will break the waiting loop. */ - gtk_widget_destroy(dlg); - } - - # ifdef FEAT_GUI_GNOME --/* ARGSUSED */ - static int - gui_gnome_dialog( int type, - char_u *title, - char_u *message, - char_u *buttons, -@@ -1609,22 +1602,20 @@ typedef struct _CancelData - int *status; - int ignore_enter; - GtkWidget *dialog; - } CancelData; - --/* ARGSUSED */ - static void - dlg_button_clicked(GtkWidget * widget, ButtonData *data) - { - *(data->status) = data->index + 1; - dlg_destroy(data->dialog); - } - - /* - * This makes the Escape key equivalent to the cancel button. - */ --/*ARGSUSED*/ - static int - dlg_key_press_event(GtkWidget *widget, GdkEventKey *event, CancelData *data) - { - /* Ignore hitting Enter (or Space) when there is no default button. */ - if (data->ignore_enter && (event->keyval == GDK_Return -@@ -1653,11 +1644,10 @@ dlg_destroy_cb(int *p) - *p = TRUE; /* set dialog_destroyed to break out of the loop */ - if (gtk_main_level() > 0) - gtk_main_quit(); - } - --/* ARGSUSED */ - int - gui_mch_dialog( int type, /* type of dialog */ - char_u *title, /* title of dialog */ - char_u *message, /* message text */ - char_u *buttons, /* names of buttons */ -@@ -2213,11 +2203,10 @@ typedef struct _DialogInfo - int ignore_enter; /* no default button, ignore "Enter" */ - int noalt; /* accept accelerators without Alt */ - GtkDialog *dialog; /* Widget of the dialog */ - } DialogInfo; - --/*ARGSUSED2*/ - static gboolean - dialog_key_press_event_cb(GtkWidget *widget, GdkEventKey *event, gpointer data) - { - DialogInfo *di = (DialogInfo *)data; - -@@ -2322,23 +2311,10 @@ gui_mch_dialog(int type, /* type of - CONVERT_FROM_UTF8_FREE(text); - } - gtk_widget_destroy(dialog); - } - -- /* Terrible hack: When the text area still has focus when we remove the -- * dialog, somehow gvim loses window focus. This is with "point to type" -- * in the KDE 3.1 window manager. Warp the mouse pointer to outside the -- * window and back to avoid that. */ -- if (!gui.in_focus) -- { -- int x, y; -- -- gdk_window_get_pointer(gui.drawarea->window, &x, &y, NULL); -- gui_mch_setmouse(-100, -100); -- gui_mch_setmouse(x, y); -- } -- - return response > 0 ? response : 0; - } - - #endif /* FEAT_GUI_DIALOG && HAVE_GTK2 */ - -@@ -2396,18 +2372,17 @@ static int popup_mouse_pos; - * at the current text cursor position. - * - * Note: The push_in output argument seems to affect scrolling of huge - * menus that don't fit on the screen. Leave it at the default for now. - */ --/*ARGSUSED0*/ - static void --popup_menu_position_func(GtkMenu *menu, -+popup_menu_position_func(GtkMenu *menu UNUSED, - gint *x, gint *y, - # ifdef HAVE_GTK2 -- gboolean *push_in, -+ gboolean *push_in UNUSED, - # endif -- gpointer user_data) -+ gpointer user_data UNUSED) - { - gdk_window_get_origin(gui.drawarea->window, x, y); - - if (popup_mouse_pos) - { -@@ -2462,17 +2437,16 @@ typedef struct _SharedFindReplace - GtkWidget *find; /* 'Find Next' action button */ - GtkWidget *replace; /* 'Replace With' action button */ - GtkWidget *all; /* 'Replace All' action button */ - } SharedFindReplace; - --static SharedFindReplace find_widgets = { NULL, }; --static SharedFindReplace repl_widgets = { NULL, }; -+static SharedFindReplace find_widgets = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; -+static SharedFindReplace repl_widgets = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; - --/* ARGSUSED */ - static int - find_key_press_event( -- GtkWidget *widget, -+ GtkWidget *widget UNUSED, - GdkEventKey *event, - SharedFindReplace *frdp) - { - /* If the user is holding one of the key modifiers we will just bail out, - * thus preserving the possibility of normal focus traversal. -@@ -2960,13 +2934,12 @@ gui_gtk_synch_fonts(void) - - - /* - * Callback for actions of the find and replace dialogs - */ --/*ARGSUSED*/ - static void --find_replace_cb(GtkWidget *widget, gpointer data) -+find_replace_cb(GtkWidget *widget UNUSED, gpointer data) - { - int flags; - char_u *find_text; - char_u *repl_text; - gboolean direction_down; -@@ -3008,13 +2981,12 @@ find_replace_cb(GtkWidget *widget, gpoin - if (rc && gtk_main_level() > 0) - gtk_main_quit(); /* make sure cmd will be handled immediately */ - } - - /* our usual callback function */ --/*ARGSUSED*/ - static void --entry_activate_cb(GtkWidget *widget, gpointer data) -+entry_activate_cb(GtkWidget *widget UNUSED, gpointer data) - { - gtk_widget_grab_focus(GTK_WIDGET(data)); - } - - /* -@@ -3053,14 +3025,13 @@ entry_changed_cb(GtkWidget * entry, GtkW - } - - /* - * ":helpfind" - */ --/*ARGSUSED*/ - void - ex_helpfind(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - /* This will fail when menus are not loaded. Well, it's only for - * backwards compatibility anyway. */ - do_cmdline_cmd((char_u *)"emenu ToolBar.FindHelp"); - } ---- vim72.orig/src/gui_gtk_f.c -+++ vim72/src/gui_gtk_f.c -@@ -225,18 +225,18 @@ gtk_form_get_type(void) - { - static GtkType form_type = 0; - - if (!form_type) - { -- GtkTypeInfo form_info = -- { -- "GtkForm", -- sizeof(GtkForm), -- sizeof(GtkFormClass), -- (GtkClassInitFunc) gtk_form_class_init, -- (GtkObjectInitFunc) gtk_form_init -- }; -+ GtkTypeInfo form_info; -+ -+ vim_memset(&form_info, 0, sizeof(form_info)); -+ form_info.type_name = "GtkForm"; -+ form_info.object_size = sizeof(GtkForm); -+ form_info.class_size = sizeof(GtkFormClass); -+ form_info.class_init_func = (GtkClassInitFunc)gtk_form_class_init; -+ form_info.object_init_func = (GtkObjectInitFunc)gtk_form_init; - - form_type = gtk_type_unique(GTK_TYPE_CONTAINER, &form_info); - } - return form_type; - } -@@ -609,14 +609,13 @@ gtk_form_remove(GtkContainer *container, - g_list_free_1(tmp_list); - g_free(child); - } - } - --/*ARGSUSED1*/ - static void - gtk_form_forall(GtkContainer *container, -- gboolean include_internals, -+ gboolean include_internals UNUSED, - GtkCallback callback, - gpointer callback_data) - { - GtkForm *form; - GtkFormChild *child; -@@ -784,13 +783,12 @@ gtk_form_position_children(GtkForm *form - * This routine identifies expose events that are generated when - * we've temporarily moved the bin_window_origin, and translates - * them or discards them, depending on whether we are obscured - * or not. - */ --/*ARGSUSED1*/ - static GdkFilterReturn --gtk_form_filter(GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data) -+gtk_form_filter(GdkXEvent *gdk_xevent, GdkEvent *event UNUSED, gpointer data) - { - XEvent *xevent; - GtkForm *form; - - xevent = (XEvent *) gdk_xevent; -@@ -819,13 +817,14 @@ gtk_form_filter(GdkXEvent *gdk_xevent, G - - /* Although GDK does have a GDK_VISIBILITY_NOTIFY event, - * there is no corresponding event in GTK, so we have - * to get the events from a filter - */ --/*ARGSUSED1*/ - static GdkFilterReturn --gtk_form_main_filter(GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data) -+gtk_form_main_filter(GdkXEvent *gdk_xevent, -+ GdkEvent *event UNUSED, -+ gpointer data) - { - XEvent *xevent; - GtkForm *form; - - xevent = (XEvent *) gdk_xevent; -@@ -859,15 +858,13 @@ gtk_form_main_filter(GdkXEvent *gdk_xeve - */ - static void - gtk_form_set_static_gravity(GdkWindow *window, gboolean use_static) - { - #ifdef HAVE_GTK2 -- gboolean static_gravity_supported; -- -- static_gravity_supported = gdk_window_set_static_gravities(window, -- use_static); -- g_return_if_fail(static_gravity_supported); -+ /* We don't check if static gravity is actually supported, because it -+ * results in an annoying assertion error message. */ -+ gdk_window_set_static_gravities(window, use_static); - #else - XSetWindowAttributes xattributes; - - xattributes.win_gravity = (use_static) ? StaticGravity : NorthWestGravity; - xattributes.bit_gravity = (use_static) ? StaticGravity : NorthWestGravity; -@@ -909,25 +906,23 @@ gtk_form_send_configure(GtkForm *form) - #else - gtk_widget_event(widget, (GdkEvent*)&event); - #endif - } - --/*ARGSUSED0*/ - static void --gtk_form_child_map(GtkWidget *widget, gpointer user_data) -+gtk_form_child_map(GtkWidget *widget UNUSED, gpointer user_data) - { - GtkFormChild *child; - - child = (GtkFormChild *)user_data; - - child->mapped = TRUE; - gdk_window_show(child->window); - } - --/*ARGSUSED0*/ - static void --gtk_form_child_unmap(GtkWidget *widget, gpointer user_data) -+gtk_form_child_unmap(GtkWidget *widget UNUSED, gpointer user_data) - { - GtkFormChild *child; - - child = (GtkFormChild *)user_data; - ---- vim72.orig/src/gui_gtk_x11.c -+++ vim72/src/gui_gtk_x11.c -@@ -105,10 +105,11 @@ enum - { - TARGET_TYPE_NONE, - TARGET_UTF8_STRING, - TARGET_STRING, - TARGET_COMPOUND_TEXT, -+ TARGET_HTML, - TARGET_TEXT, - TARGET_TEXT_URI_LIST, - TARGET_TEXT_PLAIN, - TARGET_VIM, - TARGET_VIMENC -@@ -121,10 +122,11 @@ enum - static const GtkTargetEntry selection_targets[] = - { - {VIMENC_ATOM_NAME, 0, TARGET_VIMENC}, - {VIM_ATOM_NAME, 0, TARGET_VIM}, - #ifdef FEAT_MBYTE -+ {"text/html", 0, TARGET_HTML}, - {"UTF8_STRING", 0, TARGET_UTF8_STRING}, - #endif - {"COMPOUND_TEXT", 0, TARGET_COMPOUND_TEXT}, - {"TEXT", 0, TARGET_TEXT}, - {"STRING", 0, TARGET_STRING} -@@ -138,10 +140,11 @@ static const GtkTargetEntry selection_ta - */ - static const GtkTargetEntry dnd_targets[] = - { - {"text/uri-list", 0, TARGET_TEXT_URI_LIST}, - # ifdef FEAT_MBYTE -+ {"text/html", 0, TARGET_HTML}, - {"UTF8_STRING", 0, TARGET_UTF8_STRING}, - # endif - {"STRING", 0, TARGET_STRING}, - {"text/plain", 0, TARGET_TEXT_PLAIN} - }; -@@ -176,10 +179,11 @@ static GdkAtom save_yourself_atom = GDK_ - - /* - * Atoms used to control/reference X11 selections. - */ - #ifdef FEAT_MBYTE -+static GdkAtom html_atom = GDK_NONE; - static GdkAtom utf8_string_atom = GDK_NONE; - #endif - #ifndef HAVE_GTK2 - static GdkAtom compound_text_atom = GDK_NONE; - static GdkAtom text_atom = GDK_NONE; -@@ -410,10 +414,11 @@ static char **gui_argv = NULL; - #ifdef HAVE_GTK2 - static const char *role_argument = NULL; - #endif - #if defined(FEAT_GUI_GNOME) && defined(FEAT_SESSION) - static const char *restart_command = NULL; -+static char *abs_restart_command = NULL; - #endif - static int found_iconic_arg = FALSE; - - #ifdef FEAT_GUI_GNOME - /* -@@ -447,12 +452,14 @@ gui_mch_prepare(int *argc, char **argv) - if (strchr(argv[0], G_DIR_SEPARATOR) != NULL) - { - char_u buf[MAXPATHL]; - - if (mch_FullName((char_u *)argv[0], buf, (int)sizeof(buf), TRUE) == OK) -- /* Tiny leak; doesn't matter, and usually we don't even get here */ -- restart_command = (char *)vim_strsave(buf); -+ { -+ abs_restart_command = (char *)vim_strsave(buf); -+ restart_command = abs_restart_command; -+ } - } - #endif - - /* - * Move all the entries in argv which are relevant to GTK+ and GNOME -@@ -609,21 +616,25 @@ gui_mch_prepare(int *argc, char **argv) - #if defined(EXITFREE) || defined(PROTO) - void - gui_mch_free_all() - { - vim_free(gui_argv); -+#if defined(FEAT_GUI_GNOME) && defined(FEAT_SESSION) -+ vim_free(abs_restart_command); -+#endif - } - #endif - - /* - * This should be maybe completely removed. - * Doesn't seem possible, since check_copy_area() relies on - * this information. --danielk - */ --/*ARGSUSED*/ - static gint --visibility_event(GtkWidget *widget, GdkEventVisibility *event, gpointer data) -+visibility_event(GtkWidget *widget UNUSED, -+ GdkEventVisibility *event, -+ gpointer data UNUSED) - { - gui.visibility = event->state; - /* - * When we do an gdk_window_copy_area(), and the window is partially - * obscured, we want to receive an event to tell us whether it worked -@@ -636,13 +647,14 @@ visibility_event(GtkWidget *widget, GdkE - } - - /* - * Redraw the corresponding portions of the screen. - */ --/*ARGSUSED*/ - static gint --expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data) -+expose_event(GtkWidget *widget UNUSED, -+ GdkEventExpose *event, -+ gpointer data UNUSED) - { - /* Skip this when the GUI isn't set up yet, will redraw later. */ - if (gui.starting) - return FALSE; - -@@ -666,13 +678,14 @@ expose_event(GtkWidget *widget, GdkEvent - - #ifdef FEAT_CLIENTSERVER - /* - * Handle changes to the "Comm" property - */ --/*ARGSUSED2*/ - static gint --property_event(GtkWidget *widget, GdkEventProperty *event, gpointer data) -+property_event(GtkWidget *widget, -+ GdkEventProperty *event, -+ gpointer data UNUSED) - { - if (event->type == GDK_PROPERTY_NOTIFY - && event->state == (int)GDK_PROPERTY_NEW_VALUE - && GDK_WINDOW_XWINDOW(event->window) == commWindow - && GET_X_ATOM(event->atom) == commProperty) -@@ -738,13 +751,12 @@ gui_mch_stop_blink(void) - if (blink_state == BLINK_OFF) - gui_update_cursor(TRUE, FALSE); - blink_state = BLINK_NONE; - } - --/*ARGSUSED*/ - static gint --blink_cb(gpointer data) -+blink_cb(gpointer data UNUSED) - { - if (blink_state == BLINK_ON) - { - gui_undraw_cursor(); - blink_state = BLINK_OFF; -@@ -779,13 +791,14 @@ gui_mch_start_blink(void) - blink_state = BLINK_ON; - gui_update_cursor(TRUE, FALSE); - } - } - --/*ARGSUSED*/ - static gint --enter_notify_event(GtkWidget *widget, GdkEventCrossing *event, gpointer data) -+enter_notify_event(GtkWidget *widget UNUSED, -+ GdkEventCrossing *event UNUSED, -+ gpointer data UNUSED) - { - if (blink_state == BLINK_NONE) - gui_mch_start_blink(); - - /* make sure keyboard input goes there */ -@@ -793,23 +806,25 @@ enter_notify_event(GtkWidget *widget, Gd - gtk_widget_grab_focus(gui.drawarea); - - return FALSE; - } - --/*ARGSUSED*/ - static gint --leave_notify_event(GtkWidget *widget, GdkEventCrossing *event, gpointer data) -+leave_notify_event(GtkWidget *widget UNUSED, -+ GdkEventCrossing *event UNUSED, -+ gpointer data UNUSED) - { - if (blink_state != BLINK_NONE) - gui_mch_stop_blink(); - - return FALSE; - } - --/*ARGSUSED*/ - static gint --focus_in_event(GtkWidget *widget, GdkEventFocus *event, gpointer data) -+focus_in_event(GtkWidget *widget, -+ GdkEventFocus *event UNUSED, -+ gpointer data UNUSED) - { - gui_focus_change(TRUE); - - if (blink_state == BLINK_NONE) - gui_mch_start_blink(); -@@ -824,13 +839,14 @@ focus_in_event(GtkWidget *widget, GdkEve - gtk_main_quit(); - - return TRUE; - } - --/*ARGSUSED*/ - static gint --focus_out_event(GtkWidget *widget, GdkEventFocus *event, gpointer data) -+focus_out_event(GtkWidget *widget UNUSED, -+ GdkEventFocus *event UNUSED, -+ gpointer data UNUSED) - { - gui_focus_change(FALSE); - - if (blink_state != BLINK_NONE) - gui_mch_stop_blink(); -@@ -954,13 +970,14 @@ modifiers_gdk2mouse(guint state) - } - - /* - * Main keyboard handler: - */ --/*ARGSUSED*/ - static gint --key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer data) -+key_press_event(GtkWidget *widget UNUSED, -+ GdkEventKey *event, -+ gpointer data UNUSED) - { - #ifdef HAVE_GTK2 - /* 256 bytes is way over the top, but for safety let's reduce it only - * for GTK+ 2 where we know for sure how large the string might get. - * (That is, up to 6 bytes + NUL + CSI escapes + safety measure.) */ -@@ -1223,13 +1240,14 @@ key_press_event(GtkWidget *widget, GdkEv - - return TRUE; - } - - #if defined(FEAT_XIM) && defined(HAVE_GTK2) --/*ARGSUSED0*/ - static gboolean --key_release_event(GtkWidget *widget, GdkEventKey *event, gpointer data) -+key_release_event(GtkWidget *widget UNUSED, -+ GdkEventKey *event, -+ gpointer data UNUSED) - { - /* - * GTK+ 2 input methods may do fancy stuff on key release events too. - * With the default IM for instance, you can enter any UCS code point - * by holding down CTRL-SHIFT and typing hexadecimal digits. -@@ -1241,15 +1259,14 @@ key_release_event(GtkWidget *widget, Gdk - - /**************************************************************************** - * Selection handlers: - */ - --/*ARGSUSED*/ - static gint --selection_clear_event(GtkWidget *widget, -+selection_clear_event(GtkWidget *widget UNUSED, - GdkEventSelection *event, -- gpointer user_data) -+ gpointer user_data UNUSED) - { - if (event->selection == clip_plus.gtk_sel_atom) - clip_lose_selection(&clip_plus); - else - clip_lose_selection(&clip_star); -@@ -1263,16 +1280,15 @@ selection_clear_event(GtkWidget *widget - #define RS_NONE 0 /* selection_received_cb() not called yet */ - #define RS_OK 1 /* selection_received_cb() called and OK */ - #define RS_FAIL 2 /* selection_received_cb() called and failed */ - static int received_selection = RS_NONE; - --/*ARGSUSED*/ - static void --selection_received_cb(GtkWidget *widget, -+selection_received_cb(GtkWidget *widget UNUSED, - GtkSelectionData *data, -- guint time_, -- gpointer user_data) -+ guint time_ UNUSED, -+ gpointer user_data UNUSED) - { - VimClipboard *cbd; - char_u *text; - char_u *tmpbuf = NULL; - #ifdef HAVE_GTK2 -@@ -1350,10 +1366,28 @@ selection_received_cb(GtkWidget *widget - text = tmpbuf; - } - else - text = tmpbuf_utf8; - } -+ else if (len >= 2 && text[0] == 0xff && text[1] == 0xfe) -+ { -+ vimconv_T conv; -+ -+ /* UTF-16, we get this for HTML */ -+ conv.vc_type = CONV_NONE; -+ convert_setup_ext(&conv, (char_u *)"utf-16le", FALSE, p_enc, TRUE); -+ -+ if (conv.vc_type != CONV_NONE) -+ { -+ text += 2; -+ len -= 2; -+ tmpbuf = string_convert(&conv, text, &len); -+ convert_setup(&conv, NULL, NULL); -+ } -+ if (tmpbuf != NULL) -+ text = tmpbuf; -+ } - } - #else /* !HAVE_GTK2 */ - # ifdef FEAT_MBYTE - else if (data->type == utf8_string_atom) - { -@@ -1412,17 +1446,16 @@ selection_received_cb(GtkWidget *widget - - /* - * Prepare our selection data for passing it to the external selection - * client. - */ --/*ARGSUSED*/ - static void --selection_get_cb(GtkWidget *widget, -+selection_get_cb(GtkWidget *widget UNUSED, - GtkSelectionData *selection_data, - guint info, -- guint time_, -- gpointer user_data) -+ guint time_ UNUSED, -+ gpointer user_data UNUSED) - { - char_u *string; - char_u *tmpbuf; - long_u tmplen; - int length; -@@ -1438,10 +1471,11 @@ selection_get_cb(GtkWidget *widget, - if (!cbd->owned) - return; /* Shouldn't ever happen */ - - if (info != (guint)TARGET_STRING - #ifdef FEAT_MBYTE -+ && (!clip_html || info != (guint)TARGET_HTML) - && info != (guint)TARGET_UTF8_STRING - && info != (guint)TARGET_VIMENC - #endif - && info != (guint)TARGET_VIM - && info != (guint)TARGET_COMPOUND_TEXT -@@ -1473,10 +1507,44 @@ selection_get_cb(GtkWidget *widget, - string = tmpbuf; - type = vim_atom; - } - - #ifdef FEAT_MBYTE -+ else if (info == (guint)TARGET_HTML) -+ { -+ vimconv_T conv; -+ -+ /* Since we get utf-16, we probably should set it as well. */ -+ conv.vc_type = CONV_NONE; -+ convert_setup_ext(&conv, p_enc, TRUE, (char_u *)"utf-16le", FALSE); -+ if (conv.vc_type != CONV_NONE) -+ { -+ tmpbuf = string_convert(&conv, string, &length); -+ convert_setup(&conv, NULL, NULL); -+ vim_free(string); -+ string = tmpbuf; -+ } -+ -+ /* Prepend the BOM: "fffe" */ -+ if (string != NULL) -+ { -+ tmpbuf = alloc(length + 2); -+ tmpbuf[0] = 0xff; -+ tmpbuf[1] = 0xfe; -+ mch_memmove(tmpbuf + 2, string, (size_t)length); -+ vim_free(string); -+ string = tmpbuf; -+ length += 2; -+ -+ selection_data->type = selection_data->target; -+ selection_data->format = 16; /* 16 bits per char */ -+ gtk_selection_data_set(selection_data, html_atom, 16, -+ string, length); -+ vim_free(string); -+ } -+ return; -+ } - else if (info == (guint)TARGET_VIMENC) - { - int l = STRLEN(p_enc); - - /* contents: motion_type 'encoding' NUL text */ -@@ -1676,11 +1744,11 @@ process_motion_notify(int x, int y, GdkM - dx = x < 0 ? -x : x - gui.drawarea->allocation.width; - dy = y < 0 ? -y : y - gui.drawarea->allocation.height; - - offshoot = dx > dy ? dx : dy; - -- /* Make a linearly declaying timer delay with a threshold of 5 at a -+ /* Make a linearly decaying timer delay with a threshold of 5 at a - * distance of 127 pixels from the main window. - * - * One could think endlessly about the most ergonomic variant here. - * For example it could make sense to calculate the distance from the - * drags start instead... -@@ -1705,13 +1773,12 @@ process_motion_notify(int x, int y, GdkM - } - - /* - * Timer used to recognize multiple clicks of the mouse button. - */ --/*ARGSUSED0*/ - static gint --motion_repeat_timer_cb(gpointer data) -+motion_repeat_timer_cb(gpointer data UNUSED) - { - int x; - int y; - GdkModifierType state; - -@@ -1747,13 +1814,14 @@ motion_repeat_timer_cb(gpointer data) - /* Don't happen again. We will get reinstalled in the synthetic event - * if needed -- thus repeating should still work. */ - return FALSE; - } - --/*ARGSUSED2*/ - static gint --motion_notify_event(GtkWidget *widget, GdkEventMotion *event, gpointer data) -+motion_notify_event(GtkWidget *widget, -+ GdkEventMotion *event, -+ gpointer data UNUSED) - { - if (event->is_hint) - { - int x; - int y; -@@ -1775,13 +1843,14 @@ motion_notify_event(GtkWidget *widget, G - /* - * Mouse button handling. Note please that we are capturing multiple click's - * by our own timeout mechanism instead of the one provided by GTK+ itself. - * This is due to the way the generic VIM code is recognizing multiple clicks. - */ --/*ARGSUSED2*/ - static gint --button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data) -+button_press_event(GtkWidget *widget, -+ GdkEventButton *event, -+ gpointer data UNUSED) - { - int button; - int repeated_click = FALSE; - int x, y; - int_u vim_modifiers; -@@ -1853,13 +1922,14 @@ button_press_event(GtkWidget *widget, Gd - #ifdef HAVE_GTK2 - /* - * GTK+ 2 doesn't handle mouse buttons 4, 5, 6 and 7 the same way as GTK+ 1. - * Instead, it abstracts scrolling via the new GdkEventScroll. - */ --/*ARGSUSED2*/ - static gboolean --scroll_event(GtkWidget *widget, GdkEventScroll *event, gpointer data) -+scroll_event(GtkWidget *widget, -+ GdkEventScroll *event, -+ gpointer data UNUSED) - { - int button; - int_u vim_modifiers; - - if (gtk_socket_id != 0 && !GTK_WIDGET_HAS_FOCUS(widget)) -@@ -1894,13 +1964,14 @@ scroll_event(GtkWidget *widget, GdkEvent - return TRUE; - } - #endif /* HAVE_GTK2 */ - - --/*ARGSUSED*/ - static gint --button_release_event(GtkWidget *widget, GdkEventButton *event, gpointer data) -+button_release_event(GtkWidget *widget UNUSED, -+ GdkEventButton *event, -+ gpointer data UNUSED) - { - int x, y; - int_u vim_modifiers; - - /* Remove any motion "machine gun" timers used for automatic further -@@ -2098,20 +2169,19 @@ drag_handle_text(GdkDragContext *con - } - - /* - * DND receiver. - */ --/*ARGSUSED2*/ - static void - drag_data_received_cb(GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - GtkSelectionData *data, - guint info, - guint time_, -- gpointer user_data) -+ gpointer user_data UNUSED) - { - GdkModifierType state; - - /* Guard against trash */ - if (data->data == NULL -@@ -2141,11 +2211,10 @@ drag_data_received_cb(GtkWidget *widget - /* - * GnomeClient interact callback. Check for unsaved buffers that cannot - * be abandoned and pop up a dialog asking the user for confirmation if - * necessary. - */ --/*ARGSUSED0*/ - static void - sm_client_check_changed_any(GnomeClient *client, - gint key, - GnomeDialogType type, - gpointer data) -@@ -2249,11 +2318,10 @@ write_session_file(char_u *filename) - /* - * "save_yourself" signal handler. Initiate an interaction to ask the user - * for confirmation if necessary. Save the current editing session and tell - * the session manager how to restart Vim. - */ --/*ARGSUSED1*/ - static gboolean - sm_client_save_yourself(GnomeClient *client, - gint phase, - GnomeSaveStyle save_style, - gboolean shutdown, -@@ -2337,11 +2405,10 @@ sm_client_save_yourself(GnomeClient - /* - * Called when the session manager wants us to die. There isn't much to save - * here since "save_yourself" has been emitted before (unless serious trouble - * is happening). - */ --/*ARGSUSED0*/ - static void - sm_client_die(GnomeClient *client, gpointer data) - { - /* Don't write messages to the GUI anymore */ - full_screen = FALSE; -@@ -2377,14 +2444,13 @@ setup_save_yourself(void) - - # ifdef USE_XSMP - /* - * GTK tells us that XSMP needs attention - */ --/*ARGSUSED*/ - static gboolean - local_xsmp_handle_requests(source, condition, data) -- GIOChannel *source; -+ GIOChannel *source UNUSED; - GIOCondition condition; - gpointer data; - { - if (condition == G_IO_IN) - { -@@ -2478,20 +2544,22 @@ setup_save_yourself(void) - * - * The GNOME session support is much cooler anyway. Unlike this ugly - * WM_SAVE_YOURSELF hack it actually stores the session... And yes, - * it should work with KDE as well. - */ --/*ARGSUSED1*/ - static GdkFilterReturn --global_event_filter(GdkXEvent *xev, GdkEvent *event, gpointer data) -+global_event_filter(GdkXEvent *xev, -+ GdkEvent *event UNUSED, -+ gpointer data UNUSED) - { - XEvent *xevent = (XEvent *)xev; - - if (xevent != NULL - && xevent->type == ClientMessage - && xevent->xclient.message_type == GET_X_ATOM(wm_protocols_atom) -- && xevent->xclient.data.l[0] == GET_X_ATOM(save_yourself_atom)) -+ && (long_u)xevent->xclient.data.l[0] -+ == GET_X_ATOM(save_yourself_atom)) - { - out_flush(); - ml_sync_all(FALSE, FALSE); /* preserve all swap files */ - /* - * Set the window's WM_COMMAND property, to let the window manager -@@ -2510,11 +2578,10 @@ global_event_filter(GdkXEvent *xev, GdkE - # else /* !HAVE_GTK2 */ - - /* - * GDK handler for X ClientMessage events. - */ --/*ARGSUSED2*/ - static GdkFilterReturn - gdk_wm_protocols_filter(GdkXEvent *xev, GdkEvent *event, gpointer data) - { - /* From example in gdkevents.c/gdk_wm_protocols_filter */ - XEvent *xevent = (XEvent *)xev; -@@ -2556,13 +2623,12 @@ gdk_wm_protocols_filter(GdkXEvent *xev, - - - /* - * Setup the window icon & xcmdsrv comm after the main window has been realized. - */ --/*ARGSUSED*/ - static void --mainwin_realize(GtkWidget *widget, gpointer data) -+mainwin_realize(GtkWidget *widget UNUSED, gpointer data UNUSED) - { - /* If you get an error message here, you still need to unpack the runtime - * archive! */ - #ifdef magick - # undef magick -@@ -2710,15 +2776,14 @@ create_blank_pointer(void) - - return cursor; - } - - #ifdef HAVE_GTK_MULTIHEAD --/*ARGSUSED1*/ - static void - mainwin_screen_changed_cb(GtkWidget *widget, -- GdkScreen *previous_screen, -- gpointer data) -+ GdkScreen *previous_screen UNUSED, -+ gpointer data UNUSED) - { - if (!gtk_widget_has_screen(widget)) - return; - - /* -@@ -2755,13 +2820,12 @@ mainwin_screen_changed_cb(GtkWidget *wi - * dummy blank cursor. - * - * Don't try to set any VIM scrollbar sizes anywhere here. I'm relying on the - * fact that the main VIM engine doesn't take them into account anywhere. - */ --/*ARGSUSED1*/ - static void --drawarea_realize_cb(GtkWidget *widget, gpointer data) -+drawarea_realize_cb(GtkWidget *widget, gpointer data UNUSED) - { - GtkWidget *sbar; - - #ifdef FEAT_XIM - xim_init(); -@@ -2787,13 +2851,12 @@ drawarea_realize_cb(GtkWidget *widget, g - } - - /* - * Properly clean up on shutdown. - */ --/*ARGSUSED0*/ - static void --drawarea_unrealize_cb(GtkWidget *widget, gpointer data) -+drawarea_unrealize_cb(GtkWidget *widget UNUSED, gpointer data UNUSED) - { - /* Don't write messages to the GUI anymore */ - full_screen = FALSE; - - #ifdef FEAT_XIM -@@ -2825,26 +2888,26 @@ drawarea_unrealize_cb(GtkWidget *widget, - gdk_cursor_destroy(gui.blank_pointer); - gui.blank_pointer = NULL; - #endif - } - --/*ARGSUSED0*/ - static void --drawarea_style_set_cb(GtkWidget *widget, -- GtkStyle *previous_style, -- gpointer data) -+drawarea_style_set_cb(GtkWidget *widget UNUSED, -+ GtkStyle *previous_style UNUSED, -+ gpointer data UNUSED) - { - gui_mch_new_colors(); - } - - /* - * Callback routine for the "delete_event" signal on the toplevel window. - * Tries to vim gracefully, or refuses to exit with changed buffers. - */ --/*ARGSUSED*/ - static gint --delete_event_cb(GtkWidget *widget, GdkEventAny *event, gpointer data) -+delete_event_cb(GtkWidget *widget UNUSED, -+ GdkEventAny *event UNUSED, -+ gpointer data UNUSED) - { - gui_shell_closed(); - return TRUE; - } - -@@ -2962,11 +3025,11 @@ update_window_manager_hints(int force_wi - int min_width; - int min_height; - - /* At start-up, don't try to set the hints until the initial - * values have been used (those that dictate our initial size) -- * Let forced (i.e., correct) values thruogh always. -+ * Let forced (i.e., correct) values through always. - */ - if (!(force_width && force_height) && init_window_hints_state > 0) - { - /* Don't do it! */ - init_window_hints_state = 2; -@@ -3140,13 +3203,12 @@ static GtkTooltips *tabline_tooltip; - static int clicked_page; /* page clicked in tab line */ - - /* - * Handle selecting an item in the tab line popup menu. - */ --/*ARGSUSED*/ - static void --tabline_menu_handler(GtkMenuItem *item, gpointer user_data) -+tabline_menu_handler(GtkMenuItem *item UNUSED, gpointer user_data) - { - /* Add the string cmd into input buffer */ - send_tabline_menu_event(clicked_page, (int)(long)user_data); - - if (gtk_main_level() > 0) -@@ -3242,17 +3304,16 @@ on_tabline_menu(GtkWidget *widget, GdkEv - } - - /* - * Handle selecting one of the tabs. - */ --/*ARGSUSED*/ - static void - on_select_tab( -- GtkNotebook *notebook, -- GtkNotebookPage *page, -+ GtkNotebook *notebook UNUSED, -+ GtkNotebookPage *page UNUSED, - gint idx, -- gpointer data) -+ gpointer data UNUSED) - { - if (!ignore_tabline_evt) - { - if (send_tabline_event(idx + 1) && gtk_main_level() > 0) - gtk_main_quit(); -@@ -3458,10 +3519,11 @@ gui_mch_init(void) - /* LINTED: avoid warning: conversion to 'unsigned long' */ - gui.spcolor = g_new0(GdkColor, 1); - - /* Initialise atoms */ - #ifdef FEAT_MBYTE -+ html_atom = gdk_atom_intern("text/html", FALSE); - utf8_string_atom = gdk_atom_intern("UTF8_STRING", FALSE); - #endif - #ifndef HAVE_GTK2 - compound_text_atom = gdk_atom_intern("COMPOUND_TEXT", FALSE); - text_atom = gdk_atom_intern("TEXT", FALSE); -@@ -3782,11 +3844,11 @@ gui_mch_init(void) - wm_protocols_atom = gdk_atom_intern("WM_PROTOCOLS", FALSE); - save_yourself_atom = gdk_atom_intern("WM_SAVE_YOURSELF", FALSE); - #endif - - if (gtk_socket_id != 0) -- /* make sure keybord input can go to the drawarea */ -+ /* make sure keyboard input can go to the drawarea */ - GTK_WIDGET_SET_FLAGS(gui.drawarea, GTK_CAN_FOCUS); - - /* - * Set clipboard specific atoms - */ -@@ -3920,14 +3982,14 @@ gui_mch_new_colors(void) - } - - /* - * This signal informs us about the need to rearrange our sub-widgets. - */ --/*ARGSUSED*/ - static gint --form_configure_event(GtkWidget *widget, GdkEventConfigure *event, -- gpointer data) -+form_configure_event(GtkWidget *widget UNUSED, -+ GdkEventConfigure *event, -+ gpointer data UNUSED) - { - int usable_height = event->height; - - /* When in a GtkPlug, we can't guarantee valid heights (as a round - * no. of char-heights), so we have to manually sanitise them. -@@ -3946,13 +4008,12 @@ form_configure_event(GtkWidget *widget, - /* - * Function called when window already closed. - * We can't do much more here than to trying to preserve what had been done, - * since the window is already inevitably going away. - */ --/*ARGSUSED0*/ - static void --mainwin_destroy_cb(GtkObject *object, gpointer data) -+mainwin_destroy_cb(GtkObject *object UNUSED, gpointer data UNUSED) - { - /* Don't write messages to the GUI anymore */ - full_screen = FALSE; - - gui.mainwin = NULL; -@@ -3978,13 +4039,12 @@ mainwin_destroy_cb(GtkObject *object, gp - * Thus set hints at start-up to ensure correct init. size, then a - * second after the final attempt to reset the real minimum hinst (done by - * scrollbar init.), actually do the standard hinst and stop the timer. - * We'll not let the default hints be set while this timer's active. - */ --/*ARGSUSED*/ - static gboolean --check_startup_plug_hints(gpointer data) -+check_startup_plug_hints(gpointer data UNUSED) - { - if (init_window_hints_state == 1) - { - /* Safe to use normal hints now */ - init_window_hints_state = 0; -@@ -4004,10 +4064,12 @@ check_startup_plug_hints(gpointer data) - int - gui_mch_open(void) - { - guicolor_T fg_pixel = INVALCOLOR; - guicolor_T bg_pixel = INVALCOLOR; -+ guint pixel_width; -+ guint pixel_height; - - #ifdef HAVE_GTK2 - /* - * Allow setting a window role on the command line, or invent one - * if none was specified. This is mainly useful for GNOME session -@@ -4044,20 +4106,18 @@ gui_mch_open(void) - { - int mask; - unsigned int w, h; - int x = 0; - int y = 0; -- guint pixel_width; -- guint pixel_height; - - mask = XParseGeometry((char *)gui.geom, &x, &y, &w, &h); - - if (mask & WidthValue) - Columns = w; - if (mask & HeightValue) - { -- if (p_window > h - 1 || !option_was_set((char_u *)"window")) -+ if (p_window > (long)h - 1 || !option_was_set((char_u *)"window")) - p_window = h - 1; - Rows = h; - } - - pixel_width = (guint)(gui_get_base_width() + Columns * gui.char_width); -@@ -4068,18 +4128,18 @@ gui_mch_open(void) - pixel_height += get_menu_tool_height(); - #endif - - if (mask & (XValue | YValue)) - { -- int w, h; -- gui_mch_get_screen_dimensions(&w, &h); -- h += p_ghr + get_menu_tool_height(); -- w += get_menu_tool_width(); -+ int ww, hh; -+ gui_mch_get_screen_dimensions(&ww, &hh); -+ hh += p_ghr + get_menu_tool_height(); -+ ww += get_menu_tool_width(); - if (mask & XNegative) -- x += w - pixel_width; -+ x += ww - pixel_width; - if (mask & YNegative) -- y += h - pixel_height; -+ y += hh - pixel_height; - #ifdef HAVE_GTK2 - gtk_window_move(GTK_WINDOW(gui.mainwin), x, y); - #else - gtk_widget_set_uposition(gui.mainwin, x, y); - #endif -@@ -4098,13 +4158,20 @@ gui_mch_open(void) - init_window_hints_state = 1; - g_timeout_add(1000, check_startup_plug_hints, NULL); - } - } - -- gtk_form_set_size(GTK_FORM(gui.formwin), -- (guint)(gui_get_base_width() + Columns * gui.char_width), -- (guint)(gui_get_base_height() + Rows * gui.char_height)); -+ pixel_width = (guint)(gui_get_base_width() + Columns * gui.char_width); -+ pixel_height = (guint)(gui_get_base_height() + Rows * gui.char_height); -+#ifdef HAVE_GTK2 -+ /* For GTK2 changing the size of the form widget doesn't cause window -+ * resizing. */ -+ if (gtk_socket_id == 0) -+ gtk_window_resize(GTK_WINDOW(gui.mainwin), pixel_width, pixel_height); -+#else -+ gtk_form_set_size(GTK_FORM(gui.formwin), pixel_width, pixel_height); -+#endif - update_window_manager_hints(0, 0); - - if (foreground_argument != NULL) - fg_pixel = gui_get_color((char_u *)foreground_argument); - if (fg_pixel == INVALCOLOR) -@@ -4227,13 +4294,12 @@ gui_mch_open(void) - - return OK; - } - - --/*ARGSUSED0*/ - void --gui_mch_exit(int rc) -+gui_mch_exit(int rc UNUSED) - { - if (gui.mainwin != NULL) - gtk_widget_destroy(gui.mainwin); - - if (gtk_main_level() > 0) -@@ -4284,11 +4350,10 @@ static int resize_idle_installed = FALSE - * DISABLED: When doing ":set lines+=1" this function would first invoke - * gui_resize_shell() with the old size, then the normal callback would - * report the new size through form_configure_event(). That caused the window - * layout to be messed up. - */ --/*ARGSUSED0*/ - static gboolean - force_shell_resize_idle(gpointer data) - { - if (gui.mainwin != NULL - && GTK_WIDGET_REALIZED(gui.mainwin) -@@ -4309,19 +4374,41 @@ force_shell_resize_idle(gpointer data) - return FALSE; /* don't call me again */ - } - #endif - #endif /* HAVE_GTK2 */ - -+#if defined(HAVE_GTK2) || defined(PROTO) -+/* -+ * Return TRUE if the main window is maximized. -+ */ -+ int -+gui_mch_maximized() -+{ -+ return (gui.mainwin != NULL && gui.mainwin->window != NULL -+ && (gdk_window_get_state(gui.mainwin->window) -+ & GDK_WINDOW_STATE_MAXIMIZED)); -+} -+ -+/* -+ * Unmaximize the main window -+ */ -+ void -+gui_mch_unmaximize() -+{ -+ if (gui.mainwin != NULL) -+ gtk_window_unmaximize(GTK_WINDOW(gui.mainwin)); -+} -+#endif -+ - /* - * Set the windows size. - */ --/*ARGSUSED2*/ - void - gui_mch_set_shellsize(int width, int height, -- int min_width, int min_height, -- int base_width, int base_height, -- int direction) -+ int min_width UNUSED, int min_height UNUSED, -+ int base_width UNUSED, int base_height UNUSED, -+ int direction UNUSED) - { - #ifndef HAVE_GTK2 - /* Hack: When the form already is at the desired size, the window might - * have been resized with the mouse. Force a resize by setting a - * different size first. */ -@@ -4411,13 +4498,12 @@ gui_mch_get_screen_dimensions(int *scree - *screen_w -= get_menu_tool_width(); - *screen_h -= get_menu_tool_height(); - } - - #if defined(FEAT_TITLE) || defined(PROTO) --/*ARGSUSED*/ - void --gui_mch_settitle(char_u *title, char_u *icon) -+gui_mch_settitle(char_u *title, char_u *icon UNUSED) - { - # ifdef HAVE_GTK2 - if (title != NULL && output_conv.vc_type != CONV_NONE) - title = string_convert(&output_conv, title, NULL); - # endif -@@ -4491,11 +4577,10 @@ gui_mch_show_toolbar(int showit) - #ifndef HAVE_GTK2 - /* - * Get a font structure for highlighting. - * "cbdata" is a pointer to the global gui structure. - */ --/*ARGSUSED*/ - static void - font_sel_ok(GtkWidget *wgt, gpointer cbdata) - { - gui_T *vw = (gui_T *)cbdata; - GtkFontSelectionDialog *fs = (GtkFontSelectionDialog *)vw->fontdlg; -@@ -4507,22 +4592,20 @@ font_sel_ok(GtkWidget *wgt, gpointer cbd - gtk_widget_hide(vw->fontdlg); - if (gtk_main_level() > 0) - gtk_main_quit(); - } - --/*ARGSUSED*/ - static void - font_sel_cancel(GtkWidget *wgt, gpointer cbdata) - { - gui_T *vw = (gui_T *)cbdata; - - gtk_widget_hide(vw->fontdlg); - if (gtk_main_level() > 0) - gtk_main_quit(); - } - --/*ARGSUSED*/ - static void - font_sel_destroy(GtkWidget *wgt, gpointer cbdata) - { - gui_T *vw = (gui_T *)cbdata; - -@@ -4618,11 +4701,10 @@ gui_mch_adjust_charheight(void) - - #if defined(FEAT_XFONTSET) || defined(PROTO) - /* - * Try to load the requested fontset. - */ --/*ARGSUSED2*/ - GuiFontset - gui_mch_get_fontset(char_u *name, int report_error, int fixed_width) - { - GdkFont *font; - -@@ -4675,10 +4757,13 @@ gui_mch_font_dialog(char_u *oldval) - } - - if (oldval != NULL && *oldval != NUL) - gtk_font_selection_dialog_set_font_name( - GTK_FONT_SELECTION_DIALOG(gui.fontdlg), (char *)oldval); -+ else -+ gtk_font_selection_dialog_set_font_name( -+ GTK_FONT_SELECTION_DIALOG(gui.fontdlg), DEFAULT_FONT); - - if (gui.fontname) - { - g_free(gui.fontname); - gui.fontname = NULL; -@@ -4762,10 +4847,13 @@ gui_mch_font_dialog(char_u *oldval) - GTK_FONT_SELECTION_DIALOG(dialog), (const char *)oldname); - - if (oldname != oldval) - vim_free(oldname); - } -+ else -+ gtk_font_selection_dialog_set_font_name( -+ GTK_FONT_SELECTION_DIALOG(dialog), DEFAULT_FONT); - - response = gtk_dialog_run(GTK_DIALOG(dialog)); - - if (response == GTK_RESPONSE_OK) - { -@@ -4861,11 +4949,11 @@ get_styled_font_variants(char_u * font_n - - styled_font[0] = &gui.bold_font; - styled_font[1] = &gui.ital_font; - styled_font[2] = &gui.boldital_font; - -- /* First free whatever was freviously there. */ -+ /* First free whatever was previously there. */ - for (i = 0; i < 3; ++i) - if (*styled_font[i]) - { - gdk_font_unref(*styled_font[i]); - *styled_font[i] = NULL; -@@ -5010,13 +5098,12 @@ ascii_glyph_table_init(void) - - /* - * Initialize Vim to use the font or fontset with the given name. - * Return FAIL if the font could not be loaded, OK otherwise. - */ --/*ARGSUSED1*/ - int --gui_mch_init_font(char_u *font_name, int fontset) -+gui_mch_init_font(char_u *font_name, int fontset UNUSED) - { - #ifdef HAVE_GTK2 - PangoFontDescription *font_desc; - PangoLayout *layout; - int width; -@@ -5178,12 +5265,28 @@ gui_mch_init_font(char_u *font_name, int - gtk_widget_show(alignment); - } - # endif - #endif /* !HAVE_GTK2 */ - -- /* Preserve the logical dimensions of the screen. */ -- update_window_manager_hints(0, 0); -+#ifdef HAVE_GTK2 -+ if (gui_mch_maximized()) -+ { -+ int w, h; -+ -+ /* Update lines and columns in accordance with the new font, keep the -+ * window maximized. */ -+ gtk_window_get_size(GTK_WINDOW(gui.mainwin), &w, &h); -+ w -= get_menu_tool_width(); -+ h -= get_menu_tool_height(); -+ gui_resize_shell(w, h); -+ } -+ else -+#endif -+ { -+ /* Preserve the logical dimensions of the screen. */ -+ update_window_manager_hints(0, 0); -+ } - - return OK; - } - - /* -@@ -5324,13 +5427,12 @@ gui_mch_get_font(char_u *name, int repor - - #if defined(FEAT_EVAL) || defined(PROTO) - /* - * Return the name of font "font" in allocated memory. - */ --/*ARGSUSED*/ - char_u * --gui_mch_get_fontname(GuiFont font, char_u *name) -+gui_mch_get_fontname(GuiFont font, char_u *name UNUSED) - { - # ifdef HAVE_GTK2 - if (font != NOFONT) - { - char *pangoname = pango_font_description_to_string(font); -@@ -5730,11 +5832,11 @@ draw_glyph_string(int row, int col, int - static void - draw_under(int flags, int row, int col, int cells) - { - int i; - int offset; -- const static int val[8] = {1, 0, 0, 0, 1, 2, 2, 2 }; -+ static const int val[8] = {1, 0, 0, 0, 1, 2, 2, 2 }; - int y = FILL_Y(row + 1) - 1; - - /* Undercurl: draw curl at the bottom of the character cell. */ - if (flags & DRAW_UNDERC) - { -@@ -6083,16 +6185,19 @@ gui_mch_draw_string(int row, int col, ch - while (p < s + len) - { - # ifdef FEAT_MBYTE - if (enc_utf8) - { -- c = utf_ptr2char(p); -+ int pcc[MAX_MCO]; -+ -+ /* TODO: use the composing characters */ -+ c = utfc_ptr2char_len(p, pcc, len - (p - s)); - if (c >= 0x10000) /* show chars > 0xffff as ? */ - c = 0xbf; - buf[textlen].byte1 = c >> 8; - buf[textlen].byte2 = c; -- p += utf_ptr2len(p); -+ p += utfc_ptr2len_len(p, len - (p - s)); - width += utf_char2cells(c); - } - else - # endif - { -@@ -6112,12 +6217,12 @@ gui_mch_draw_string(int row, int col, ch - textlen = len; - # ifdef FEAT_MBYTE - if (has_mbyte) - { - width = 0; -- for (p = s; p < s + len; p += (*mb_ptr2len)(p)) -- width += (*mb_ptr2cells)(p); -+ for (p = s; p < s + len; p += (*mb_ptr2len_len)(p, len - (p - s))) -+ width += (*mb_ptr2cells_len)(p, len - (p - s)); - } - else - # endif - width = len; - } -@@ -6400,11 +6505,10 @@ input_timer_cb(gpointer data) - - #ifdef FEAT_SNIFF - /* - * Callback function, used when data is available on the SNiFF connection. - */ --/* ARGSUSED */ - static void - sniff_request_cb( - gpointer data, - gint source_fd, - GdkInputCondition condition) -@@ -6663,16 +6767,18 @@ gui_mch_insert_lines(int row, int num_li - void - clip_mch_request_selection(VimClipboard *cbd) - { - GdkAtom target; - unsigned i; -- int nbytes; -- char_u *buffer; - time_t start; - - for (i = 0; i < N_SELECTION_TARGETS; ++i) - { -+#ifdef FEAT_MBYTE -+ if (!clip_html && selection_targets[i].info == TARGET_HTML) -+ continue; -+#endif - received_selection = RS_NONE; - target = gdk_atom_intern(selection_targets[i].target, FALSE); - - gtk_selection_convert(gui.drawarea, - cbd->gtk_sel_atom, target, -@@ -6688,34 +6794,18 @@ clip_mch_request_selection(VimClipboard - if (received_selection != RS_FAIL) - return; - } - - /* Final fallback position - use the X CUT_BUFFER0 store */ -- nbytes = 0; -- buffer = (char_u *)XFetchBuffer(GDK_WINDOW_XDISPLAY(gui.mainwin->window), -- &nbytes, 0); -- if (nbytes > 0) -- { -- /* Got something */ -- clip_yank_selection(MCHAR, buffer, (long)nbytes, cbd); -- if (p_verbose > 0) -- { -- verbose_enter(); -- smsg((char_u *)_("Used CUT_BUFFER0 instead of empty selection")); -- verbose_leave(); -- } -- } -- if (buffer != NULL) -- XFree(buffer); -+ yank_cut_buffer0(GDK_WINDOW_XDISPLAY(gui.mainwin->window), cbd); - } - - /* - * Disown the selection. - */ --/*ARGSUSED*/ - void --clip_mch_lose_selection(VimClipboard *cbd) -+clip_mch_lose_selection(VimClipboard *cbd UNUSED) - { - /* WEIRD: when using NULL to actually disown the selection, we lose the - * selection the first time we own it. */ - /* - gtk_selection_owner_set(NULL, cbd->gtk_sel_atom, (guint32)GDK_CURRENT_TIME); -@@ -6739,13 +6829,12 @@ clip_mch_own_selection(VimClipboard *cbd - - /* - * Send the current selection to the clipboard. Do nothing for X because we - * will fill in the selection only when requested by another app. - */ --/*ARGSUSED*/ - void --clip_mch_set_selection(VimClipboard *cbd) -+clip_mch_set_selection(VimClipboard *cbd UNUSED) - { - } - - - #if defined(FEAT_MENU) || defined(PROTO) -@@ -6948,11 +7037,11 @@ mch_set_mouse_shape(int shape) - if (id >= GDK_LAST_CURSOR) - id = GDK_LEFT_PTR; - else - id &= ~1; /* they are always even (why?) */ - } -- else if (shape < sizeof(mshape_ids) / sizeof(int)) -+ else if (shape < (int)(sizeof(mshape_ids) / sizeof(int))) - id = mshape_ids[shape]; - else - return; - # ifdef HAVE_GTK_MULTIHEAD - c = gdk_cursor_new_for_display( ---- vim72.orig/src/gui_mac.c -+++ vim72/src/gui_mac.c -@@ -4964,11 +4964,11 @@ gui_mch_add_menu_item(vimmenu_T *menu, i - int key = 0; - int modifiers = 0; - char_u *p_actext; - - p_actext = menu->actext; -- key = find_special_key(&p_actext, &modifiers, /*keycode=*/0); -+ key = find_special_key(&p_actext, &modifiers, FALSE, FALSE); - if (*p_actext != 0) - key = 0; /* error: trailing text */ - /* find_special_key() returns a keycode with as many of the - * specified modifiers as appropriate already applied (e.g., for - * "<D-C-x>" it returns Ctrl-X as the keycode and MOD_MASK_CMD ---- vim72.orig/src/gui_motif.c -+++ vim72/src/gui_motif.c -@@ -115,14 +115,13 @@ static void gui_motif_scroll_colors __AR - - /* - * Call-back routines. - */ - --/* ARGSUSED */ - static void - scroll_cb(w, client_data, call_data) -- Widget w; -+ Widget w UNUSED; - XtPointer client_data, call_data; - { - scrollbar_T *sb; - long value; - int dragging; -@@ -134,28 +133,28 @@ scroll_cb(w, client_data, call_data) - (int)XmCR_DRAG); - gui_drag_scrollbar(sb, value, dragging); - } - - #ifdef FEAT_GUI_TABLINE --/*ARGSUSED*/ - static void - tabline_cb(w, client_data, call_data) -- Widget w; -- XtPointer client_data, call_data; -+ Widget w UNUSED; -+ XtPointer client_data UNUSED; -+ XtPointer call_data; - { - XmNotebookCallbackStruct *nptr; - - nptr = (XmNotebookCallbackStruct *)call_data; - if (nptr->reason != (int)XmCR_NONE) - send_tabline_event(nptr->page_number); - } - --/*ARGSUSED*/ - static void - tabline_button_cb(w, client_data, call_data) - Widget w; -- XtPointer client_data, call_data; -+ XtPointer client_data UNUSED; -+ XtPointer call_data UNUSED; - { - int cmd, tab_idx; - - XtVaGetValues(w, XmNuserData, &cmd, NULL); - XtVaGetValues(tabLine_menu, XmNuserData, &tab_idx, NULL); -@@ -164,15 +163,14 @@ tabline_button_cb(w, client_data, call_d - } - - /* - * Tabline single mouse click timeout handler - */ --/*ARGSUSED*/ - static void - motif_tabline_timer_cb (timed_out, interval_id) - XtPointer timed_out; -- XtIntervalId *interval_id; -+ XtIntervalId *interval_id UNUSED; - { - *((int *)timed_out) = TRUE; - } - - /* -@@ -201,17 +199,16 @@ tabline_scroller_clicked(scroller_name, - } - } - return FALSE; - } - --/*ARGSUSED*/ - static void - tabline_menu_cb(w, closure, e, continue_dispatch) - Widget w; -- XtPointer closure; -+ XtPointer closure UNUSED; - XEvent *e; -- Boolean *continue_dispatch; -+ Boolean *continue_dispatch UNUSED; - { - Widget tab_w; - XButtonPressedEvent *event; - int tab_idx = 0; - WidgetList children; -@@ -275,15 +272,14 @@ tabline_menu_cb(w, closure, e, continue_ - XtManageChildren(children, numChildren); - XmMenuPosition(tabLine_menu, (XButtonPressedEvent *)e) ; - XtManageChild(tabLine_menu); - } - --/*ARGSUSED*/ - static void - tabline_balloon_cb(beval, state) - BalloonEval *beval; -- int state; -+ int state UNUSED; - { - int nr; - tabpage_T *tp; - - if (beval->target == (Widget)0) -@@ -640,17 +636,16 @@ gui_x11_destroy_widgets() - #ifdef FEAT_MENU - menuBar = NULL; - #endif - } - --/*ARGSUSED*/ - void - gui_mch_set_text_area_pos(x, y, w, h) -- int x; -- int y; -- int w; -- int h; -+ int x UNUSED; -+ int y UNUSED; -+ int w UNUSED; -+ int h UNUSED; - { - #ifdef FEAT_TOOLBAR - /* Give keyboard focus to the textArea instead of the toolbar. */ - reset_focus(); - #endif -@@ -1259,11 +1254,11 @@ get_toolbar_pixmap(menu, fname) - } - - if (menu->icon_builtin || gui_find_bitmap(menu->name, buf, "xpm") == FAIL) - { - if (menu->iconidx >= 0 && menu->iconidx -- < (sizeof(built_in_pixmaps) / sizeof(built_in_pixmaps[0]))) -+ < (int)(sizeof(built_in_pixmaps) / sizeof(built_in_pixmaps[0]))) - xpm = built_in_pixmaps[menu->iconidx]; - else - xpm = tb_blank_xpm; - } - -@@ -1714,14 +1709,13 @@ gui_mch_destroy_menu(menu) - } - #endif - } - } - --/* ARGSUSED */ - void - gui_mch_show_popupmenu(menu) -- vimmenu_T *menu; -+ vimmenu_T *menu UNUSED; - { - #ifdef MOTIF_POPUP - XmMenuPosition(menu->submenu_id, gui_x11_get_last_mouse_event()); - XtManageChild(menu->submenu_id); - #endif -@@ -2044,13 +2038,12 @@ do_mnemonic(Widget w, unsigned int keyco - } - - /* - * Callback routine for dialog mnemonic processing. - */ --/*ARGSUSED*/ - static void --mnemonic_event(Widget w, XtPointer call_data, XKeyEvent *event) -+mnemonic_event(Widget w, XtPointer call_data UNUSED, XKeyEvent *event) - { - do_mnemonic(w, event->keycode); - } - - -@@ -2285,17 +2278,16 @@ set_predefined_fontlist(parent, name) - - /* - * Put up a file requester. - * Returns the selected name in allocated memory, or NULL for Cancel. - */ --/* ARGSUSED */ - char_u * - gui_mch_browse(saving, title, dflt, ext, initdir, filter) -- int saving; /* select file to write */ -+ int saving UNUSED; /* select file to write */ - char_u *title; /* title for the window */ - char_u *dflt; /* default name */ -- char_u *ext; /* not used (extension added) */ -+ char_u *ext UNUSED; /* not used (extension added) */ - char_u *initdir; /* initial directory, NULL for current dir */ - char_u *filter; /* file name filter */ - { - char_u dirbuf[MAXPATHL]; - char_u dfltbuf[MAXPATHL]; -@@ -2411,16 +2403,15 @@ gui_mch_browse(saving, title, dflt, ext, - */ - - /* - * Process callback from Dialog cancel actions. - */ --/* ARGSUSED */ - static void - DialogCancelCB(w, client_data, call_data) -- Widget w; /* widget id */ -- XtPointer client_data; /* data from application */ -- XtPointer call_data; /* data from widget class */ -+ Widget w UNUSED; /* widget id */ -+ XtPointer client_data UNUSED; /* data from application */ -+ XtPointer call_data UNUSED; /* data from widget class */ - { - if (browse_fname != NULL) - { - XtFree(browse_fname); - browse_fname = NULL; -@@ -2429,16 +2420,15 @@ DialogCancelCB(w, client_data, call_data - } - - /* - * Process callback from Dialog actions. - */ --/* ARGSUSED */ - static void - DialogAcceptCB(w, client_data, call_data) -- Widget w; /* widget id */ -- XtPointer client_data; /* data from application */ -- XtPointer call_data; /* data from widget class */ -+ Widget w UNUSED; /* widget id */ -+ XtPointer client_data UNUSED; /* data from application */ -+ XtPointer call_data; /* data from widget class */ - { - XmFileSelectionBoxCallbackStruct *fcb; - - if (browse_fname != NULL) - { -@@ -2465,17 +2455,16 @@ static void butproc __ARGS((Widget w, Xt - - /* - * Callback function for the textfield. When CR is hit this works like - * hitting the "OK" button, ESC like "Cancel". - */ --/* ARGSUSED */ - static void - keyhit_callback(w, client_data, event, cont) - Widget w; -- XtPointer client_data; -+ XtPointer client_data UNUSED; - XEvent *event; -- Boolean *cont; -+ Boolean *cont UNUSED; - { - char buf[2]; - KeySym key_sym; - - if (XLookupString(&(event->xkey), buf, 2, &key_sym, NULL) == 1) -@@ -2488,16 +2477,15 @@ keyhit_callback(w, client_data, event, c - if ((key_sym == XK_Left || key_sym == XK_Right) - && !(event->xkey.state & ShiftMask)) - XmTextFieldClearSelection(w, XtLastTimestampProcessed(gui.dpy)); - } - --/* ARGSUSED */ - static void - butproc(w, client_data, call_data) -- Widget w; -+ Widget w UNUSED; - XtPointer client_data; -- XtPointer call_data; -+ XtPointer call_data UNUSED; - { - dialogStatus = (int)(long)client_data + 1; - } - - #ifdef HAVE_XPM -@@ -2565,14 +2553,13 @@ create_pixmap_label(parent, name, data, - - return label; - } - #endif - --/* ARGSUSED */ - int - gui_mch_dialog(type, title, message, button_names, dfltbutton, textfield) -- int type; -+ int type UNUSED; - char_u *title; - char_u *message; - char_u *button_names; - int dfltbutton; - char_u *textfield; /* buffer of size IOSIZE */ -@@ -3195,11 +3182,11 @@ gui_mch_compute_toolbar_height() - XmNshadowThickness, &tst, - XmNmarginHeight, &tmh, - XmNchildren, &children, - XmNnumChildren, &numChildren, NULL); - borders += tst + tmh; -- for (i = 0; i < numChildren; i++) -+ for (i = 0; i < (int)numChildren; i++) - { - whgt = 0; - XtVaGetValues(children[i], XmNheight, &whgt, NULL); - if (height < whgt) - height = whgt; -@@ -3235,34 +3222,32 @@ motif_get_toolbar_colors(bgp, fgp, bsp, - /* - * The next toolbar enter/leave callbacks should really do balloon help. But - * I have to use footer help for backwards compatability. Hopefully both will - * get implemented and the user will have a choice. - */ --/*ARGSUSED*/ - static void - toolbarbutton_enter_cb(w, client_data, event, cont) -- Widget w; -+ Widget w UNUSED; - XtPointer client_data; -- XEvent *event; -- Boolean *cont; -+ XEvent *event UNUSED; -+ Boolean *cont UNUSED; - { - vimmenu_T *menu = (vimmenu_T *) client_data; - - if (menu->strings[MENU_INDEX_TIP] != NULL) - { - if (vim_strchr(p_go, GO_FOOTER) != NULL) - gui_mch_set_footer(menu->strings[MENU_INDEX_TIP]); - } - } - --/*ARGSUSED*/ - static void - toolbarbutton_leave_cb(w, client_data, event, cont) -- Widget w; -- XtPointer client_data; -- XEvent *event; -- Boolean *cont; -+ Widget w UNUSED; -+ XtPointer client_data UNUSED; -+ XEvent *event UNUSED; -+ Boolean *cont UNUSED; - { - gui_mch_set_footer((char_u *) ""); - } - # endif - #endif -@@ -3490,14 +3475,13 @@ gui_motif_scroll_colors(id) - } - - /* - * Set the fontlist for Widget "id" to use gui.menu_fontset or gui.menu_font. - */ --/*ARGSUSED*/ - void - gui_motif_menu_fontlist(id) -- Widget id; -+ Widget id UNUSED; - { - #ifdef FEAT_MENU - #ifdef FONTSET_ALWAYS - if (gui.menu_fontset != NOFONTSET) - { -@@ -3564,63 +3548,59 @@ typedef struct _SharedFindReplace - Widget undo; /* 'Undo' action button */ - - Widget cancel; - } SharedFindReplace; - --static SharedFindReplace find_widgets = { NULL }; --static SharedFindReplace repl_widgets = { NULL }; -+static SharedFindReplace find_widgets = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; -+static SharedFindReplace repl_widgets = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; - - static void find_replace_destroy_callback __ARGS((Widget w, XtPointer client_data, XtPointer call_data)); - static void find_replace_dismiss_callback __ARGS((Widget w, XtPointer client_data, XtPointer call_data)); - static void entry_activate_callback __ARGS((Widget w, XtPointer client_data, XtPointer call_data)); - static void find_replace_callback __ARGS((Widget w, XtPointer client_data, XtPointer call_data)); - static void find_replace_keypress __ARGS((Widget w, SharedFindReplace * frdp, XKeyEvent * event)); - static void find_replace_dialog_create __ARGS((char_u *entry_text, int do_replace)); - --/*ARGSUSED*/ - static void - find_replace_destroy_callback(w, client_data, call_data) -- Widget w; -+ Widget w UNUSED; - XtPointer client_data; -- XtPointer call_data; -+ XtPointer call_data UNUSED; - { - SharedFindReplace *cd = (SharedFindReplace *)client_data; - - if (cd != NULL) - /* suppress_dialog_mnemonics(cd->dialog); */ - cd->dialog = (Widget)0; - } - --/*ARGSUSED*/ - static void - find_replace_dismiss_callback(w, client_data, call_data) -- Widget w; -+ Widget w UNUSED; - XtPointer client_data; -- XtPointer call_data; -+ XtPointer call_data UNUSED; - { - SharedFindReplace *cd = (SharedFindReplace *)client_data; - - if (cd != NULL) - XtUnmanageChild(cd->dialog); - } - --/*ARGSUSED*/ - static void - entry_activate_callback(w, client_data, call_data) -- Widget w; -+ Widget w UNUSED; - XtPointer client_data; -- XtPointer call_data; -+ XtPointer call_data UNUSED; - { - XmProcessTraversal((Widget)client_data, XmTRAVERSE_CURRENT); - } - --/*ARGSUSED*/ - static void - find_replace_callback(w, client_data, call_data) -- Widget w; -+ Widget w UNUSED; - XtPointer client_data; -- XtPointer call_data; -+ XtPointer call_data UNUSED; - { - long_u flags = (long_u)client_data; - char *find_text, *repl_text; - Boolean direction_down = TRUE; - Boolean wword; -@@ -3666,14 +3646,13 @@ find_replace_callback(w, client_data, ca - XtFree(find_text); - if (repl_text != NULL) - XtFree(repl_text); - } - --/*ARGSUSED*/ - static void - find_replace_keypress(w, frdp, event) -- Widget w; -+ Widget w UNUSED; - SharedFindReplace *frdp; - XKeyEvent *event; - { - KeySym keysym; - ---- vim72.orig/src/gui_photon.c -+++ vim72/src/gui_photon.c -@@ -836,11 +836,16 @@ gui_ph_handle_window_open( - - /* TODO: Set a clipping rect? */ - static void - gui_ph_draw_start( void ) - { -+ PhGC_t *gc; -+ -+ gc = PgGetGC(); - PgSetRegion( PtWidgetRid( PtFindDisjoint( gui.vimTextArea ) ) ); -+ PgClearClippingsCx( gc ); -+ PgClearTranslationCx( gc ); - - PtWidgetOffset( gui.vimTextArea, &gui_ph_raw_offset ); - PhTranslatePoint( &gui_ph_raw_offset, PtWidgetPos( gui.vimTextArea, NULL ) ); - - PgSetTranslation( &gui_ph_raw_offset, Pg_RELATIVE ); -@@ -2968,11 +2973,11 @@ gui_mch_init_font(char_u *vim_font_name, - PhRect_t extent; - - if( vim_font_name == NULL ) - { - /* Default font */ -- vim_font_name = "PC Term"; -+ vim_font_name = "PC Terminal"; - } - - if( STRCMP( vim_font_name, "*" ) == 0 ) - { - font_tag = PtFontSelection( gui.vimWindow, NULL, NULL, ---- vim72.orig/src/gui_riscos.c -+++ vim72/src/gui_riscos.c -@@ -693,11 +693,11 @@ gui_mch_set_winpos(int x, int y) - - void - gui_mch_set_shellsize(width, height, min_width, min_height, base_width, base_height, direction) - int width; /* In OS units */ - int height; -- int min_width; /* Smallest permissable window size (ignored) */ -+ int min_width; /* Smallest permissible window size (ignored) */ - int min_height; - int base_width; /* Space for scroll bars, etc */ - int base_height; - int direction; - { -@@ -861,11 +861,11 @@ zap_load_file(name, style) - return NULL; /* Unable to load file */ - - if (strncmp(file, "ZapFont\015", 8) == 0) - return file; /* Loaded OK! */ - -- free(file); -+ vim_free(file); - return NULL; /* Not a valid font file */ - } - - /* Load and convert the named font. - * If name is NULL or a null string then convert the system font. ---- vim72.orig/src/gui_w32.c -+++ vim72/src/gui_w32.c -@@ -210,34 +210,34 @@ typedef struct _DllVersionInfo - DWORD dwMinorVersion; - DWORD dwBuildNumber; - DWORD dwPlatformID; - } DLLVERSIONINFO; - -+#include <poppack.h> -+ - typedef struct tagTOOLINFOA_NEW - { - UINT cbSize; - UINT uFlags; - HWND hwnd; -- UINT uId; -+ UINT_PTR uId; - RECT rect; - HINSTANCE hinst; - LPSTR lpszText; - LPARAM lParam; - } TOOLINFO_NEW; - - typedef struct tagNMTTDISPINFO_NEW - { - NMHDR hdr; -- LPTSTR lpszText; -+ LPSTR lpszText; - char szText[80]; - HINSTANCE hinst; - UINT uFlags; - LPARAM lParam; - } NMTTDISPINFO_NEW; - --#include <poppack.h> -- - typedef HRESULT (WINAPI* DLLGETVERSIONPROC)(DLLVERSIONINFO *); - #ifndef TTM_SETMAXTIPWIDTH - # define TTM_SETMAXTIPWIDTH (WM_USER+24) - #endif - -@@ -990,11 +990,11 @@ _WndProc( - /* Set the maximum width, this also enables using - * \n for line break. */ - SendMessage(lpdi->hdr.hwndFrom, TTM_SETMAXTIPWIDTH, - 0, 500); - -- tt_text = enc_to_ucs2(str, NULL); -+ tt_text = enc_to_utf16(str, NULL); - lpdi->lpszText = tt_text; - /* can't show tooltip if failed */ - } - else - # endif -@@ -1327,10 +1327,11 @@ gui_mch_init(void) - const char szVimWndClass[] = VIM_CLASS; - const char szTextAreaClass[] = "VimTextArea"; - WNDCLASS wndclass; - #ifdef FEAT_MBYTE - const WCHAR szVimWndClassW[] = VIM_CLASSW; -+ const WCHAR szTextAreaClassW[] = L"VimTextArea"; - WNDCLASSW wndclassw; - #endif - #ifdef GLOBAL_IME - ATOM atom; - #endif -@@ -1477,10 +1478,32 @@ gui_mch_init(void) - #if defined(FEAT_MBYTE_IME) && defined(DYNAMIC_IME) - dyn_imm_load(); - #endif - - /* Create the text area window */ -+#ifdef FEAT_MBYTE -+ if (wide_WindowProc) -+ { -+ if (GetClassInfoW(s_hinst, szTextAreaClassW, &wndclassw) == 0) -+ { -+ wndclassw.style = CS_OWNDC; -+ wndclassw.lpfnWndProc = _TextAreaWndProc; -+ wndclassw.cbClsExtra = 0; -+ wndclassw.cbWndExtra = 0; -+ wndclassw.hInstance = s_hinst; -+ wndclassw.hIcon = NULL; -+ wndclassw.hCursor = LoadCursor(NULL, IDC_ARROW); -+ wndclassw.hbrBackground = NULL; -+ wndclassw.lpszMenuName = NULL; -+ wndclassw.lpszClassName = szTextAreaClassW; -+ -+ if (RegisterClassW(&wndclassw) == 0) -+ return FAIL; -+ } -+ } -+ else -+#endif - if (GetClassInfo(s_hinst, szTextAreaClass, &wndclass) == 0) - { - wndclass.style = CS_OWNDC; - wndclass.lpfnWndProc = _TextAreaWndProc; - wndclass.cbClsExtra = 0; -@@ -1580,10 +1603,21 @@ gui_mch_init(void) - s_findrep_struct.lpstrFindWhat[0] = NUL; - s_findrep_struct.lpstrReplaceWith = alloc(MSWIN_FR_BUFSIZE); - s_findrep_struct.lpstrReplaceWith[0] = NUL; - s_findrep_struct.wFindWhatLen = MSWIN_FR_BUFSIZE; - s_findrep_struct.wReplaceWithLen = MSWIN_FR_BUFSIZE; -+# if defined(FEAT_MBYTE) && defined(WIN3264) -+ s_findrep_struct_w.lStructSize = sizeof(s_findrep_struct_w); -+ s_findrep_struct_w.lpstrFindWhat = -+ (LPWSTR)alloc(MSWIN_FR_BUFSIZE * sizeof(WCHAR)); -+ s_findrep_struct_w.lpstrFindWhat[0] = NUL; -+ s_findrep_struct_w.lpstrReplaceWith = -+ (LPWSTR)alloc(MSWIN_FR_BUFSIZE * sizeof(WCHAR)); -+ s_findrep_struct_w.lpstrReplaceWith[0] = NUL; -+ s_findrep_struct_w.wFindWhatLen = MSWIN_FR_BUFSIZE; -+ s_findrep_struct_w.wReplaceWithLen = MSWIN_FR_BUFSIZE; -+# endif - #endif - - theend: - /* Display any pending error messages */ - display_errors(); -@@ -1933,11 +1967,11 @@ GetResultStr(HWND hwnd, int GCS, int *le - /* Reads in the composition string. */ - buf = GetCompositionString_inUCS2(hIMC, GCS, lenp); - if (buf == NULL) - return NULL; - -- convbuf = ucs2_to_enc(buf, lenp); -+ convbuf = utf16_to_enc(buf, lenp); - pImmReleaseContext(hwnd, hIMC); - vim_free(buf); - return convbuf; - } - #endif -@@ -2564,11 +2598,11 @@ gui_mch_add_menu( - - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - { - /* 'encoding' differs from active codepage: convert menu name - * and use wide function */ -- wn = enc_to_ucs2(menu->name, NULL); -+ wn = enc_to_utf16(menu->name, NULL); - if (wn != NULL) - { - MENUITEMINFOW infow; - - infow.cbSize = sizeof(infow); -@@ -2726,11 +2760,11 @@ gui_mch_add_menu_item( - - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - { - /* 'encoding' differs from active codepage: convert menu item name - * and use wide function */ -- wn = enc_to_ucs2(menu->name, NULL); -+ wn = enc_to_utf16(menu->name, NULL); - if (wn != NULL) - { - n = InsertMenuW(parent->submenu_id, (UINT)idx, - (menu_is_separator(menu->name) - ? MF_SEPARATOR : MF_STRING) | MF_BYPOSITION, -@@ -2936,12 +2970,31 @@ dialog_callback( - if (button >= DLG_NONBUTTON_CONTROL) - return TRUE; - - /* If the edit box exists, copy the string. */ - if (s_textfield != NULL) -- GetDlgItemText(hwnd, DLG_NONBUTTON_CONTROL + 2, -+ { -+# if defined(FEAT_MBYTE) && defined(WIN3264) -+ /* If the OS is Windows NT, and 'encoding' differs from active -+ * codepage: use wide function and convert text. */ -+ if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT -+ && enc_codepage >= 0 && (int)GetACP() != enc_codepage) -+ { -+ WCHAR *wp = (WCHAR *)alloc(IOSIZE * sizeof(WCHAR)); -+ char_u *p; -+ -+ GetDlgItemTextW(hwnd, DLG_NONBUTTON_CONTROL + 2, wp, IOSIZE); -+ p = utf16_to_enc(wp, NULL); -+ vim_strncpy(s_textfield, p, IOSIZE); -+ vim_free(p); -+ vim_free(wp); -+ } -+ else -+# endif -+ GetDlgItemText(hwnd, DLG_NONBUTTON_CONTROL + 2, - s_textfield, IOSIZE); -+ } - - /* - * Need to check for IDOK because if the user just hits Return to - * accept the default value, some reason this is what we get. - */ -@@ -3568,11 +3621,11 @@ nCopyAnsiToWideChar( - WCHAR *wn; - - if (enc_codepage == 0 && (int)GetACP() != enc_codepage) - { - /* Not a codepage, use our own conversion function. */ -- wn = enc_to_ucs2(lpAnsiIn, NULL); -+ wn = enc_to_utf16(lpAnsiIn, NULL); - if (wn != NULL) - { - wcscpy(lpWCStr, wn); - nChar = (int)wcslen(wn) + 1; - vim_free(wn); ---- vim72.orig/src/gui_w48.c -+++ vim72/src/gui_w48.c -@@ -151,10 +151,13 @@ static int s_busy_processing = FALSE; - static int destroying = FALSE; /* call DestroyWindow() ourselves */ - - #ifdef MSWIN_FIND_REPLACE - static UINT s_findrep_msg = 0; /* set in gui_w[16/32].c */ - static FINDREPLACE s_findrep_struct; -+# if defined(FEAT_MBYTE) && defined(WIN3264) -+static FINDREPLACEW s_findrep_struct_w; -+# endif - static HWND s_findrep_hwnd = NULL; - static int s_findrep_is_find; /* TRUE for find dialog, FALSE - for find/replace dialog */ - #endif - -@@ -545,11 +548,11 @@ char_to_string(int ch, char_u *string, i - } - } - else - { - len = 1; -- ws = ucs2_to_enc(wstring, &len); -+ ws = utf16_to_enc(wstring, &len); - if (ws == NULL) - len = 0; - else - { - if (len > slen) /* just in case */ -@@ -882,19 +885,68 @@ _OnMenu( - gui_menu_cb(pMenu); - } - #endif - - #ifdef MSWIN_FIND_REPLACE -+# if defined(FEAT_MBYTE) && defined(WIN3264) -+/* -+ * copy useful data from structure LPFINDREPLACE to structure LPFINDREPLACEW -+ */ -+ static void -+findrep_atow(LPFINDREPLACEW lpfrw, LPFINDREPLACE lpfr) -+{ -+ WCHAR *wp; -+ -+ lpfrw->hwndOwner = lpfr->hwndOwner; -+ lpfrw->Flags = lpfr->Flags; -+ -+ wp = enc_to_utf16(lpfr->lpstrFindWhat, NULL); -+ wcsncpy(lpfrw->lpstrFindWhat, wp, lpfrw->wFindWhatLen - 1); -+ vim_free(wp); -+ -+ /* the field "lpstrReplaceWith" doesn't need to be copied */ -+} -+ -+/* -+ * copy useful data from structure LPFINDREPLACEW to structure LPFINDREPLACE -+ */ -+ static void -+findrep_wtoa(LPFINDREPLACE lpfr, LPFINDREPLACEW lpfrw) -+{ -+ char_u *p; -+ -+ lpfr->Flags = lpfrw->Flags; -+ -+ p = utf16_to_enc(lpfrw->lpstrFindWhat, NULL); -+ vim_strncpy(lpfr->lpstrFindWhat, p, lpfr->wFindWhatLen - 1); -+ vim_free(p); -+ -+ p = utf16_to_enc(lpfrw->lpstrReplaceWith, NULL); -+ vim_strncpy(lpfr->lpstrReplaceWith, p, lpfr->wReplaceWithLen - 1); -+ vim_free(p); -+} -+# endif -+ - /* - * Handle a Find/Replace window message. - */ - static void - _OnFindRepl(void) - { - int flags = 0; - int down; - -+# if defined(FEAT_MBYTE) && defined(WIN3264) -+ /* If the OS is Windows NT, and 'encoding' differs from active codepage: -+ * convert text from wide string. */ -+ if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT -+ && enc_codepage >= 0 && (int)GetACP() != enc_codepage) -+ { -+ findrep_wtoa(&s_findrep_struct, &s_findrep_struct_w); -+ } -+# endif -+ - if (s_findrep_struct.Flags & FR_DIALOGTERM) - /* Give main window the focus back. */ - (void)SetFocus(s_hwnd); - - if (s_findrep_struct.Flags & FR_FINDNEXT) -@@ -1030,13 +1082,12 @@ _TextAreaWndProc( - - #ifdef FEAT_BEVAL - case WM_NOTIFY: Handle_WM_Notify(hwnd, (LPNMHDR)lParam); - return TRUE; - #endif -- -- default: -- return MyWindowProc(hwnd, uMsg, wParam, lParam); -+ default: -+ return MyWindowProc(hwnd, uMsg, wParam, lParam); - } - } - - #if (defined(WIN3264) && defined(FEAT_MBYTE)) \ - || defined(GLOBAL_IME) \ -@@ -1661,12 +1712,21 @@ process_message(void) - #ifdef FEAT_OLE - /* Look after OLE Automation commands */ - if (msg.message == WM_OLE) - { - char_u *str = (char_u *)msg.lParam; -- add_to_input_buf(str, (int)STRLEN(str)); -- vim_free(str); -+ if (str == NULL || *str == NUL) -+ { -+ /* Message can't be ours, forward it. Fixes problem with Ultramon -+ * 3.0.4 */ -+ DispatchMessage(&msg); -+ } -+ else -+ { -+ add_to_input_buf(str, (int)STRLEN(str)); -+ vim_free(str); /* was allocated in CVim::SendKeys() */ -+ } - return; - } - #endif - - #ifdef FEAT_NETBEANS_INTG -@@ -1935,10 +1995,15 @@ gui_mch_wait_for_chars(int wtime) - (void)SetActiveWindow(s_hwnd); - #endif - s_need_activate = FALSE; - } - -+#ifdef FEAT_NETBEANS_INTG -+ /* Process the queued netbeans messages. */ -+ netbeans_parse_messages(); -+#endif -+ - /* - * Don't use gui_mch_update() because then we will spin-lock until a - * char arrives, instead we use GetMessage() to hang until an - * event arrives. No need to check for input_buf_full because we are - * returning as soon as it contains a single char -- webb -@@ -2126,11 +2191,11 @@ GetTextWidthEnc(HDC hdc, char_u *str, in - - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - { - /* 'encoding' differs from active codepage: convert text and use wide - * function */ -- wstr = enc_to_ucs2(str, &wlen); -+ wstr = enc_to_utf16(str, &wlen); - if (wstr != NULL) - { - n = GetTextExtentPointW(hdc, wstr, wlen, &size); - vim_free(wstr); - if (n) -@@ -2250,11 +2315,11 @@ add_tabline_popup_menu_entry(HMENU pmenu - - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - { - /* 'encoding' differs from active codepage: convert menu name - * and use wide function */ -- wn = enc_to_ucs2(item_text, NULL); -+ wn = enc_to_utf16(item_text, NULL); - if (wn != NULL) - { - MENUITEMINFOW infow; - - infow.cbSize = sizeof(infow); -@@ -2420,11 +2485,11 @@ gui_mch_update_tabline(void) - #ifdef FEAT_MBYTE - wstr = NULL; - if (use_unicode) - { - /* Need to go through Unicode. */ -- wstr = enc_to_ucs2(NameBuff, NULL); -+ wstr = enc_to_utf16(NameBuff, NULL); - if (wstr != NULL) - { - TCITEMW tiw; - - tiw.mask = TCIF_TEXT; -@@ -2519,12 +2584,12 @@ set_window_title(HWND hwnd, char *title) - if (title != NULL && enc_codepage >= 0 && enc_codepage != (int)GetACP()) - { - WCHAR *wbuf; - int n; - -- /* Convert the title from 'encoding' to ucs2. */ -- wbuf = (WCHAR *)enc_to_ucs2((char_u *)title, NULL); -+ /* Convert the title from 'encoding' to UTF-16. */ -+ wbuf = (WCHAR *)enc_to_utf16((char_u *)title, NULL); - if (wbuf != NULL) - { - n = SetWindowTextW(hwnd, wbuf); - vim_free(wbuf); - if (n != 0 || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) -@@ -2546,11 +2611,23 @@ gui_mch_find_dialog(exarg_T *eap) - DestroyWindow(s_findrep_hwnd); - - if (!IsWindow(s_findrep_hwnd)) - { - initialise_findrep(eap->arg); -- s_findrep_hwnd = FindText((LPFINDREPLACE) &s_findrep_struct); -+# if defined(FEAT_MBYTE) && defined(WIN3264) -+ /* If the OS is Windows NT, and 'encoding' differs from active -+ * codepage: convert text and use wide function. */ -+ if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT -+ && enc_codepage >= 0 && (int)GetACP() != enc_codepage) -+ { -+ findrep_atow(&s_findrep_struct_w, &s_findrep_struct); -+ s_findrep_hwnd = FindTextW( -+ (LPFINDREPLACEW) &s_findrep_struct_w); -+ } -+ else -+# endif -+ s_findrep_hwnd = FindText((LPFINDREPLACE) &s_findrep_struct); - } - - set_window_title(s_findrep_hwnd, - _("Find string (use '\\\\' to find a '\\')")); - (void)SetFocus(s_findrep_hwnd); -@@ -2571,11 +2648,22 @@ gui_mch_replace_dialog(exarg_T *eap) - DestroyWindow(s_findrep_hwnd); - - if (!IsWindow(s_findrep_hwnd)) - { - initialise_findrep(eap->arg); -- s_findrep_hwnd = ReplaceText((LPFINDREPLACE) &s_findrep_struct); -+# if defined(FEAT_MBYTE) && defined(WIN3264) -+ if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT -+ && enc_codepage >= 0 && (int)GetACP() != enc_codepage) -+ { -+ findrep_atow(&s_findrep_struct_w, &s_findrep_struct); -+ s_findrep_hwnd = ReplaceTextW( -+ (LPFINDREPLACEW) &s_findrep_struct_w); -+ } -+ else -+# endif -+ s_findrep_hwnd = ReplaceText( -+ (LPFINDREPLACE) &s_findrep_struct); - } - - set_window_title(s_findrep_hwnd, - _("Find & Replace (use '\\\\' to find a '\\')")); - (void)SetFocus(s_findrep_hwnd); -@@ -3220,11 +3308,11 @@ gui_mch_browseW( - char_u *dflt, - char_u *ext, - char_u *initdir, - char_u *filter) - { -- /* We always use the wide function. This means enc_to_ucs2() must work, -+ /* We always use the wide function. This means enc_to_utf16() must work, - * otherwise it fails miserably! */ - OPENFILENAMEW fileStruct; - WCHAR fileBuf[MAXPATHL]; - WCHAR *wp; - int i; -@@ -3236,11 +3324,11 @@ gui_mch_browseW( - - if (dflt == NULL) - fileBuf[0] = NUL; - else - { -- wp = enc_to_ucs2(dflt, NULL); -+ wp = enc_to_utf16(dflt, NULL); - if (wp == NULL) - fileBuf[0] = NUL; - else - { - for (i = 0; wp[i] != NUL && i < MAXPATHL - 1; ++i) -@@ -3255,32 +3343,32 @@ gui_mch_browseW( - - memset(&fileStruct, 0, sizeof(OPENFILENAMEW)); - #ifdef OPENFILENAME_SIZE_VERSION_400 - /* be compatible with Windows NT 4.0 */ - /* TODO: what to use for OPENFILENAMEW??? */ -- fileStruct.lStructSize = sizeof(OPENFILENAME_SIZE_VERSION_400); -+ fileStruct.lStructSize = OPENFILENAME_SIZE_VERSION_400; - #else - fileStruct.lStructSize = sizeof(fileStruct); - #endif - - if (title != NULL) -- titlep = enc_to_ucs2(title, NULL); -+ titlep = enc_to_utf16(title, NULL); - fileStruct.lpstrTitle = titlep; - - if (ext != NULL) -- extp = enc_to_ucs2(ext, NULL); -+ extp = enc_to_utf16(ext, NULL); - fileStruct.lpstrDefExt = extp; - - fileStruct.lpstrFile = fileBuf; - fileStruct.nMaxFile = MAXPATHL; - fileStruct.lpstrFilter = filterp; - fileStruct.hwndOwner = s_hwnd; /* main Vim window is owner*/ - /* has an initial dir been specified? */ - if (initdir != NULL && *initdir != NUL) - { - /* Must have backslashes here, no matter what 'shellslash' says */ -- initdirp = enc_to_ucs2(initdir, NULL); -+ initdirp = enc_to_utf16(initdir, NULL); - if (initdirp != NULL) - { - for (wp = initdirp; *wp != NUL; ++wp) - if (*wp == '/') - *wp = '\\'; -@@ -3316,11 +3404,11 @@ gui_mch_browseW( - vim_free(initdirp); - vim_free(titlep); - vim_free(extp); - - /* Convert from UCS2 to 'encoding'. */ -- p = ucs2_to_enc(fileBuf, NULL); -+ p = utf16_to_enc(fileBuf, NULL); - if (p != NULL) - /* when out of memory we get garbage for non-ASCII chars */ - STRCPY(fileBuf, p); - vim_free(p); - -@@ -3333,11 +3421,11 @@ gui_mch_browseW( - # endif /* FEAT_MBYTE */ - - - /* - * Convert the string s to the proper format for a filter string by replacing -- * the \t and \n delimeters with \0. -+ * the \t and \n delimiters with \0. - * Returns the converted string in allocated memory. - * - * Keep in sync with convert_filterW() above! - */ - static char_u * -@@ -3416,11 +3504,11 @@ gui_mch_browse( - filterp = convert_filter(filter); - - memset(&fileStruct, 0, sizeof(OPENFILENAME)); - #ifdef OPENFILENAME_SIZE_VERSION_400 - /* be compatible with Windows NT 4.0 */ -- fileStruct.lStructSize = sizeof(OPENFILENAME_SIZE_VERSION_400); -+ fileStruct.lStructSize = OPENFILENAME_SIZE_VERSION_400; - #else - fileStruct.lStructSize = sizeof(fileStruct); - #endif - - fileStruct.lpstrTitle = title; -@@ -3516,11 +3604,11 @@ _OnDropFiles( - if (fnames != NULL) - for (i = 0; i < cFiles; ++i) - { - #ifdef FEAT_MBYTE - if (DragQueryFileW(hDrop, i, wszFile, BUFPATHLEN) > 0) -- fnames[i] = ucs2_to_enc(wszFile, NULL); -+ fnames[i] = utf16_to_enc(wszFile, NULL); - else - #endif - { - DragQueryFile(hDrop, i, szFile, BUFPATHLEN); - fnames[i] = vim_strsave(szFile); -@@ -3672,11 +3760,12 @@ _OnScroll( - /* - * Get command line arguments. - * Use "prog" as the name of the program and "cmdline" as the arguments. - * Copy the arguments to allocated memory. - * Return the number of arguments (including program name). -- * Return pointers to the arguments in "argvp". -+ * Return pointers to the arguments in "argvp". Memory is allocated with -+ * malloc(), use free() instead of vim_free(). - * Return pointer to buffer in "tofree". - * Returns zero when out of memory. - */ - /*ARGSUSED*/ - int -@@ -3690,10 +3779,12 @@ get_cmd_args(char *prog, char *cmdline, - int inquote; - int argc; - char **argv = NULL; - int round; - -+ *tofree = NULL; -+ - #ifdef FEAT_MBYTE - /* Try using the Unicode version first, it takes care of conversion when - * 'encoding' is changed. */ - argc = get_cmd_argsW(&argv); - if (argc != 0) -@@ -3800,18 +3891,18 @@ get_cmd_args(char *prog, char *cmdline, - if (round == 1) - { - argv = (char **)malloc((argc + 1) * sizeof(char *)); - if (argv == NULL ) - { -- vim_free(newcmdline); -+ free(newcmdline); - return 0; /* malloc error */ - } - pnew = newcmdline; -+ *tofree = newcmdline; - } - } - - done: -- - argv[argc] = NULL; /* NULL-terminated list */ - *argvp = argv; - return argc; - } ---- vim72.orig/src/gui_x11.c -+++ vim72/src/gui_x11.c -@@ -568,26 +568,24 @@ static char **gui_argv = NULL; - - /* - * Call-back routines. - */ - --/* ARGSUSED */ - static void - gui_x11_timer_cb(timed_out, interval_id) - XtPointer timed_out; -- XtIntervalId *interval_id; -+ XtIntervalId *interval_id UNUSED; - { - *((int *)timed_out) = TRUE; - } - --/* ARGSUSED */ - static void - gui_x11_visibility_cb(w, dud, event, dum) -- Widget w; -- XtPointer dud; -+ Widget w UNUSED; -+ XtPointer dud UNUSED; - XEvent *event; -- Boolean *dum; -+ Boolean *dum UNUSED; - { - if (event->type != VisibilityNotify) - return; - - gui.visibility = event->xvisibility.state; -@@ -601,17 +599,16 @@ gui_x11_visibility_cb(w, dud, event, dum - - /* This is needed for when redrawing is slow. */ - gui_mch_update(); - } - --/* ARGSUSED */ - static void - gui_x11_expose_cb(w, dud, event, dum) -- Widget w; -- XtPointer dud; -+ Widget w UNUSED; -+ XtPointer dud UNUSED; - XEvent *event; -- Boolean *dum; -+ Boolean *dum UNUSED; - { - XExposeEvent *gevent; - int new_x; - - if (event->type != Expose) -@@ -678,17 +675,16 @@ shellRectangle(Widget shell, XRectangle - r->y = absy; - XtVaGetValues(shell, XmNheight, &r->height, XmNwidth, &r->width, NULL); - } - #endif - --/* ARGSUSED */ - static void - gui_x11_resize_window_cb(w, dud, event, dum) -- Widget w; -- XtPointer dud; -+ Widget w UNUSED; -+ XtPointer dud UNUSED; - XEvent *event; -- Boolean *dum; -+ Boolean *dum UNUSED; - { - static int lastWidth, lastHeight; - - if (event->type != ConfigureNotify) - return; -@@ -725,56 +721,52 @@ gui_x11_resize_window_cb(w, dud, event, - #ifdef FEAT_XIM - xim_set_preedit(); - #endif - } - --/* ARGSUSED */ - static void - gui_x11_focus_change_cb(w, data, event, dum) -- Widget w; -- XtPointer data; -+ Widget w UNUSED; -+ XtPointer data UNUSED; - XEvent *event; -- Boolean *dum; -+ Boolean *dum UNUSED; - { - gui_focus_change(event->type == FocusIn); - } - --/* ARGSUSED */ - static void - gui_x11_enter_cb(w, data, event, dum) -- Widget w; -- XtPointer data; -- XEvent *event; -- Boolean *dum; -+ Widget w UNUSED; -+ XtPointer data UNUSED; -+ XEvent *event UNUSED; -+ Boolean *dum UNUSED; - { - gui_focus_change(TRUE); - } - --/* ARGSUSED */ - static void - gui_x11_leave_cb(w, data, event, dum) -- Widget w; -- XtPointer data; -- XEvent *event; -- Boolean *dum; -+ Widget w UNUSED; -+ XtPointer data UNUSED; -+ XEvent *event UNUSED; -+ Boolean *dum UNUSED; - { - gui_focus_change(FALSE); - } - - #if defined(X_HAVE_UTF8_STRING) && defined(FEAT_MBYTE) - # if X_HAVE_UTF8_STRING - # define USE_UTF8LOOKUP - # endif - #endif - --/* ARGSUSED */ - void - gui_x11_key_hit_cb(w, dud, event, dum) -- Widget w; -- XtPointer dud; -+ Widget w UNUSED; -+ XtPointer dud UNUSED; - XEvent *event; -- Boolean *dum; -+ Boolean *dum UNUSED; - { - XKeyPressedEvent *ev_press; - #ifdef FEAT_XIM - char_u string2[256]; - char_u string_shortbuf[256]; -@@ -1076,17 +1068,16 @@ theend: - if (string_alloced) - XtFree((char *)string); - #endif - } - --/* ARGSUSED */ - static void - gui_x11_mouse_cb(w, dud, event, dum) -- Widget w; -- XtPointer dud; -+ Widget w UNUSED; -+ XtPointer dud UNUSED; - XEvent *event; -- Boolean *dum; -+ Boolean *dum UNUSED; - { - static XtIntervalId timer = (XtIntervalId)0; - static int timed_out = TRUE; - - int button; -@@ -1208,15 +1199,15 @@ gui_mch_prepare(argc, argv) - gui_argv[gui_argc++] = argv[0]; - arg = 1; - while (arg < *argc) - { - /* Look for argv[arg] in cmdline_options[] table */ -- for (i = 0; i < XtNumber(cmdline_options); i++) -+ for (i = 0; i < (int)XtNumber(cmdline_options); i++) - if (strcmp(argv[arg], cmdline_options[i].option) == 0) - break; - -- if (i < XtNumber(cmdline_options)) -+ if (i < (int)XtNumber(cmdline_options)) - { - /* Remember finding "-rv" or "-reverse" */ - if (strcmp("-rv", argv[arg]) == 0 - || strcmp("-reverse", argv[arg]) == 0) - found_reverse_arg = TRUE; -@@ -1317,16 +1308,15 @@ gui_mch_init_check() - */ - static XtInputId _xsmp_xtinputid; - - static void local_xsmp_handle_requests __ARGS((XtPointer c, int *s, XtInputId *i)); - --/*ARGSUSED*/ - static void - local_xsmp_handle_requests(c, s, i) -- XtPointer c; -- int *s; -- XtInputId *i; -+ XtPointer c UNUSED; -+ int *s UNUSED; -+ XtInputId *i UNUSED; - { - if (xsmp_handle_requests() == FAIL) - XtRemoveInput(_xsmp_xtinputid); - } - #endif -@@ -1436,11 +1426,11 @@ gui_mch_init() - mask = XParseGeometry((char *)gui.geom, &x, &y, &w, &h); - if (mask & WidthValue) - Columns = w; - if (mask & HeightValue) - { -- if (p_window > h - 1 || !option_was_set((char_u *)"window")) -+ if (p_window > (long)h - 1 || !option_was_set((char_u *)"window")) - p_window = h - 1; - Rows = h; - } - /* - * Set the (x,y) position of the main window only if specified in the -@@ -1585,10 +1575,12 @@ gui_mch_uninit() - { - gui_x11_destroy_widgets(); - XtCloseDisplay(gui.dpy); - gui.dpy = NULL; - vimShell = (Widget)0; -+ vim_free(gui_argv); -+ gui_argv = NULL; - } - - /* - * Called when the foreground or background color has been changed. - */ -@@ -1749,20 +1741,21 @@ gui_init_menu_font() - } - #endif - } - #endif - --/*ARGSUSED*/ - void - gui_mch_exit(rc) -- int rc; -+ int rc UNUSED; - { - #if 0 - /* Lesstif gives an error message here, and so does Solaris. The man page - * says that this isn't needed when exiting, so just skip it. */ - XtCloseDisplay(gui.dpy); - #endif -+ vim_free(gui_argv); -+ gui_argv = NULL; - } - - /* - * Get the position of the top left corner of the window. - */ -@@ -1793,21 +1786,20 @@ gui_mch_set_winpos(x, y) - XtNx, x, - XtNy, y, - NULL); - } - --/*ARGSUSED*/ - void - gui_mch_set_shellsize(width, height, min_width, min_height, - base_width, base_height, direction) - int width; - int height; - int min_width; - int min_height; - int base_width; - int base_height; -- int direction; -+ int direction UNUSED; - { - #ifdef FEAT_XIM - height += xim_get_status_area_height(), - #endif - XtVaSetValues(vimShell, -@@ -1841,15 +1833,14 @@ gui_mch_get_screen_dimensions(screen_w, - * Initialise vim to use the font "font_name". If it's NULL, pick a default - * font. - * If "fontset" is TRUE, load the "font_name" as a fontset. - * Return FAIL if the font could not be loaded, OK otherwise. - */ --/*ARGSUSED*/ - int - gui_mch_init_font(font_name, do_fontset) - char_u *font_name; -- int do_fontset; -+ int do_fontset UNUSED; - { - XFontStruct *font = NULL; - - #ifdef FEAT_XFONTSET - XFontSet fontset = NULL; -@@ -2023,14 +2014,13 @@ gui_mch_get_font(name, giveErrorIfMissin - #if defined(FEAT_EVAL) || defined(PROTO) - /* - * Return the name of font "font" in allocated memory. - * Don't know how to get the actual name, thus use the provided name. - */ --/*ARGSUSED*/ - char_u * - gui_mch_get_fontname(font, name) -- GuiFont font; -+ GuiFont font UNUSED; - char_u *name; - { - if (name == NULL) - return NULL; - return vim_strsave(name); -@@ -2448,11 +2438,11 @@ find_closest_color(colormap, colorPtr) - { - gui.color_approx = TRUE; - *colorPtr = colortable[closest]; - } - -- free(colortable); -+ vim_free(colortable); - return OK; - } - - /* - * Set the current text foreground color. -@@ -2515,11 +2505,11 @@ draw_curl(row, col, cells) - int col; - int cells; - { - int i; - int offset; -- const static int val[8] = {1, 0, 0, 0, 1, 2, 2, 2 }; -+ static const int val[8] = {1, 0, 0, 0, 1, 2, 2, 2 }; - - XSetForeground(gui.dpy, gui.text_gc, prev_sp_color); - for (i = FILL_X(col); i < FILL_X(col + cells); ++i) - { - offset = val[i % 8]; -@@ -2563,12 +2553,14 @@ gui_mch_draw_string(row, col, s, len, fl - { - c = utf_ptr2char(p); - # ifdef FEAT_XFONTSET - if (current_fontset != NULL) - { -- if (c >= 0x10000 && sizeof(wchar_t) <= 2) -+# ifdef SMALL_WCHAR_T -+ if (c >= 0x10000) - c = 0xbf; /* show chars > 0xffff as ? */ -+# endif - ((wchar_t *)buf)[wlen] = c; - } - else - # endif - { -@@ -3130,15 +3122,15 @@ gui_mch_menu_hidden(menu, hidden) - gui_mch_draw_menubar() - { - /* Nothing to do in X */ - } - --/* ARGSUSED */ - void - gui_x11_menu_cb(w, client_data, call_data) -- Widget w; -- XtPointer client_data, call_data; -+ Widget w UNUSED; -+ XtPointer client_data; -+ XtPointer call_data UNUSED; - { - gui_menu_cb((vimmenu_T *)client_data); - } - - #endif /* FEAT_MENU */ -@@ -3147,17 +3139,16 @@ gui_x11_menu_cb(w, client_data, call_dat - - /* - * Function called when window closed. Works like ":qa". - * Should put up a requester! - */ --/*ARGSUSED*/ - static void - gui_x11_wm_protocol_handler(w, client_data, event, dum) -- Widget w; -- XtPointer client_data; -+ Widget w UNUSED; -+ XtPointer client_data UNUSED; - XEvent *event; -- Boolean *dum; -+ Boolean *dum UNUSED; - { - /* - * Only deal with Client messages. - */ - if (event->type != ClientMessage) -@@ -3166,11 +3157,11 @@ gui_x11_wm_protocol_handler(w, client_da - /* - * The WM_SAVE_YOURSELF event arrives when the window manager wants to - * exit. That can be cancelled though, thus Vim shouldn't exit here. - * Just sync our swap files. - */ -- if (((XClientMessageEvent *)event)->data.l[0] == -+ if ((Atom)((XClientMessageEvent *)event)->data.l[0] == - wm_atoms[SAVE_YOURSELF_IDX]) - { - out_flush(); - ml_sync_all(FALSE, FALSE); /* preserve all swap files */ - -@@ -3179,28 +3170,27 @@ gui_x11_wm_protocol_handler(w, client_da - * thus set argv to NULL. */ - XSetCommand(gui.dpy, XtWindow(vimShell), NULL, 0); - return; - } - -- if (((XClientMessageEvent *)event)->data.l[0] != -+ if ((Atom)((XClientMessageEvent *)event)->data.l[0] != - wm_atoms[DELETE_WINDOW_IDX]) - return; - - gui_shell_closed(); - } - - #ifdef FEAT_CLIENTSERVER - /* - * Function called when property changed. Check for incoming commands - */ --/*ARGSUSED*/ - static void - gui_x11_send_event_handler(w, client_data, event, dum) -- Widget w; -- XtPointer client_data; -+ Widget w UNUSED; -+ XtPointer client_data UNUSED; - XEvent *event; -- Boolean *dum; -+ Boolean *dum UNUSED; - { - XPropertyEvent *e = (XPropertyEvent *) event; - - if (e->type == PropertyNotify && e->window == commWindow - && e->atom == commProperty && e->state == PropertyNewValue) -@@ -3271,15 +3261,14 @@ gui_mch_start_blink() - blink_state = BLINK_ON; - gui_update_cursor(TRUE, FALSE); - } - } - --/* ARGSUSED */ - static void - gui_x11_blink_cb(timed_out, interval_id) -- XtPointer timed_out; -- XtIntervalId *interval_id; -+ XtPointer timed_out UNUSED; -+ XtIntervalId *interval_id UNUSED; - { - if (blink_state == BLINK_ON) - { - gui_undraw_cursor(); - blink_state = BLINK_OFF; -@@ -3437,62 +3426,51 @@ gui_mch_drawsign(row, col, typenr) - void * - gui_mch_register_sign(signfile) - char_u *signfile; - { - XpmAttributes attrs; -- XImage *sign; -+ XImage *sign = NULL; - int status; - - /* - * Setup the color substitution table. - */ -- sign = NULL; - if (signfile[0] != NUL && signfile[0] != '-') - { -- sign = (XImage *)alloc(sizeof(XImage)); -- if (sign != NULL) -+ XpmColorSymbol color[5] = - { -- XpmColorSymbol color[5] = -- { -- {"none", NULL, 0}, -- {"iconColor1", NULL, 0}, -- {"bottomShadowColor", NULL, 0}, -- {"topShadowColor", NULL, 0}, -- {"selectColor", NULL, 0} -- }; -- attrs.valuemask = XpmColorSymbols; -- attrs.numsymbols = 2; -- attrs.colorsymbols = color; -- attrs.colorsymbols[0].pixel = gui.back_pixel; -- attrs.colorsymbols[1].pixel = gui.norm_pixel; -- status = XpmReadFileToImage(gui.dpy, (char *)signfile, -+ {"none", NULL, 0}, -+ {"iconColor1", NULL, 0}, -+ {"bottomShadowColor", NULL, 0}, -+ {"topShadowColor", NULL, 0}, -+ {"selectColor", NULL, 0} -+ }; -+ attrs.valuemask = XpmColorSymbols; -+ attrs.numsymbols = 2; -+ attrs.colorsymbols = color; -+ attrs.colorsymbols[0].pixel = gui.back_pixel; -+ attrs.colorsymbols[1].pixel = gui.norm_pixel; -+ status = XpmReadFileToImage(gui.dpy, (char *)signfile, - &sign, NULL, &attrs); -- -- if (status == 0) -- { -- /* Sign width is fixed at two columns now. -- if (sign->width > gui.sign_width) -- gui.sign_width = sign->width + 8; */ -- } -- else -- { -- vim_free(sign); -- sign = NULL; -- EMSG(_(e_signdata)); -- } -+ if (status == 0) -+ { -+ /* Sign width is fixed at two columns now. -+ if (sign->width > gui.sign_width) -+ gui.sign_width = sign->width + 8; */ - } -+ else -+ EMSG(_(e_signdata)); - } - - return (void *)sign; - } - - void - gui_mch_destroy_sign(sign) - void *sign; - { -- XFree(((XImage *)sign)->data); -- vim_free(sign); -+ XDestroyImage((XImage*)sign); - } - #endif - - - #ifdef FEAT_MOUSESHAPE ---- vim72.orig/src/gui_xmdlg.c -+++ vim72/src/gui_xmdlg.c -@@ -8,11 +8,11 @@ - */ - - /* - * (C) 2001,2005 by Marcin Dalecki <martin@dalecki.de> - * -- * Implementation of dialogue functions for the Motif GUI variant. -+ * Implementation of dialog functions for the Motif GUI variant. - * - * Note about Lesstif: Apparently lesstif doesn't get the widget layout right, - * when using a dynamic scrollbar policy. - */ - -@@ -367,14 +367,14 @@ fill_lists(enum ListSpecifier fix, Share - char *list[NONE][MAX_ENTRIES_IN_LIST]; - int count[NONE]; - char buf[TEMP_BUF_SIZE]; - XmString items[MAX_ENTRIES_IN_LIST]; - int i; -- int index; -+ int idx; - -- for (index = (int)ENCODING; index < (int)NONE; ++index) -- count[index] = 0; -+ for (idx = (int)ENCODING; idx < (int)NONE; ++idx) -+ count[idx] = 0; - - /* First we insert the wild char into every single list. */ - if (fix != ENCODING) - add_to_list(list[ENCODING], wild, &count[ENCODING]); - if (fix != NAME) -@@ -446,11 +446,11 @@ fill_lists(enum ListSpecifier fix, Share - { - Widget button; - - items[i] = XmStringCreateLocalized(list[ENCODING][i]); - -- if (i < n_items) -+ if (i < (int)n_items) - { - /* recycle old button */ - XtVaSetValues(children[i], - XmNlabelString, items[i], - XmNuserData, i, -@@ -479,11 +479,11 @@ fill_lists(enum ListSpecifier fix, Share - XtFree(list[ENCODING][i]); - } - - /* Destroy all the outstanding menu items. - */ -- for (i = count[ENCODING]; i < n_items; ++i) -+ for (i = count[ENCODING]; i < (int)n_items; ++i) - { - XtUnmanageChild(children[i]); - XtDestroyWidget(children[i]); - } - -@@ -501,18 +501,18 @@ fill_lists(enum ListSpecifier fix, Share - } - - /* - * Now loop trough the remaining lists and set them up. - */ -- for (index = (int)NAME; index < (int)NONE; ++index) -+ for (idx = (int)NAME; idx < (int)NONE; ++idx) - { - Widget w; - -- if (fix == (enum ListSpecifier)index) -+ if (fix == (enum ListSpecifier)idx) - continue; - -- switch ((enum ListSpecifier)index) -+ switch ((enum ListSpecifier)idx) - { - case NAME: - w = data->list[NAME]; - break; - case STYLE: -@@ -523,32 +523,31 @@ fill_lists(enum ListSpecifier fix, Share - break; - default: - w = (Widget)0; /* for lint */ - } - -- for (i = 0; i < count[index]; ++i) -+ for (i = 0; i < count[idx]; ++i) - { -- items[i] = XmStringCreateLocalized(list[index][i]); -- XtFree(list[index][i]); -+ items[i] = XmStringCreateLocalized(list[idx][i]); -+ XtFree(list[idx][i]); - } - XmListDeleteAllItems(w); -- XmListAddItems(w, items, count[index], 1); -- if (data->sel[index]) -+ XmListAddItems(w, items, count[idx], 1); -+ if (data->sel[idx]) - { - XmStringFree(items[0]); -- items[0] = XmStringCreateLocalized(data->sel[index]); -+ items[0] = XmStringCreateLocalized(data->sel[idx]); - XmListSelectItem(w, items[0], False); - XmListSetBottomItem(w, items[0]); - } -- for (i = 0; i < count[index]; ++i) -+ for (i = 0; i < count[idx]; ++i) - XmStringFree(items[i]); - } - } - --/*ARGSUSED*/ - static void --stoggle_callback(Widget w, -+stoggle_callback(Widget w UNUSED, - SharedFontSelData *data, - XmToggleButtonCallbackStruct *call_data) - { - int i, do_sel; - char newSize[TEMP_BUF_SIZE]; -@@ -632,20 +631,23 @@ do_choice(Widget w, - - if (!data->sel[which]) - data->sel[which] = XtNewString(sel); - else - { -- XtFree(data->sel[which]); - if (!strcmp(data->sel[which], sel)) - { - /* unselecting current selection */ -+ XtFree(data->sel[which]); - data->sel[which] = NULL; - if (w) - XmListDeselectItem(w, call_data->item); - } - else -+ { -+ XtFree(data->sel[which]); - data->sel[which] = XtNewString(sel); -+ } - } - XtFree(sel); - - fill_lists(which, data); - -@@ -693,29 +695,28 @@ do_choice(Widget w, - else - { - int n; - XmString str; - Arg args[4]; -- char *msg = _("no specific match"); -+ char *nomatch_msg = _("no specific match"); - - n = 0; -- str = XmStringCreateLocalized(msg); -+ str = XmStringCreateLocalized(nomatch_msg); - XtSetArg(args[n], XmNlabelString, str); ++n; - XtSetValues(data->sample, args, n); - apply_fontlist(data->sample); -- XmTextSetString(data->name, msg); -+ XmTextSetString(data->name, nomatch_msg); - XmStringFree(str); - - return False; - } - } - --/*ARGSUSED*/ - static void - encoding_callback(Widget w, - SharedFontSelData *data, -- XtPointer dummy) -+ XtPointer dummy UNUSED) - { - XmString str; - XmListCallbackStruct fake_data; - - XtVaGetValues(w, XmNlabelString, &str, NULL); -@@ -750,15 +751,14 @@ size_callback(Widget w, - XmListCallbackStruct *call_data) - { - do_choice(w, data, call_data, SIZE); - } - --/*ARGSUSED*/ - static void --cancel_callback(Widget w, -+cancel_callback(Widget w UNUSED, - SharedFontSelData *data, -- XmListCallbackStruct *call_data) -+ XmListCallbackStruct *call_data UNUSED) - { - if (data->sel[ENCODING]) - { - XtFree(data->sel[ENCODING]); - data->sel[ENCODING] = NULL; -@@ -787,15 +787,14 @@ cancel_callback(Widget w, - XFreeFontNames(data->names); - data->names = NULL; - data->exit = True; - } - --/*ARGSUSED*/ - static void --ok_callback(Widget w, -+ok_callback(Widget w UNUSED, - SharedFontSelData *data, -- XmPushButtonCallbackStruct *call_data) -+ XmPushButtonCallbackStruct *call_data UNUSED) - { - char *pattern; - char **name; - int i; - -@@ -884,25 +883,25 @@ gui_xm_select_font(char_u *current) - */ - - { - int i; - int max; -- int index = 0; -+ int idx = 0; - int size; -- char str[128]; -+ char buf[128]; - - for (i = 0, max = 0; i < data->num; i++) - { -- get_part(fn(data, i), 7, str); -- size = atoi(str); -+ get_part(fn(data, i), 7, buf); -+ size = atoi(buf); - if ((size > max) && (size < MAX_DISPLAY_SIZE)) - { -- index = i; -+ idx = i; - max = size; - } - } -- strcpy(big_font, fn(data, index)); -+ strcpy(big_font, fn(data, idx)); - } - data->old = XLoadQueryFont(XtDisplay(parent), big_font); - data->old_list = gui_motif_create_fontlist(data->old); - - /* Set the title of the Dialog window. */ -@@ -1215,32 +1214,32 @@ gui_xm_select_font(char_u *current) - - names = XListFonts(XtDisplay(form), (char *) current, 1, &i); - - if (i != 0) - { -- char name[TEMP_BUF_SIZE]; -- char style[TEMP_BUF_SIZE]; -- char size[TEMP_BUF_SIZE]; -- char encoding[TEMP_BUF_SIZE]; -+ char namebuf[TEMP_BUF_SIZE]; -+ char stylebuf[TEMP_BUF_SIZE]; -+ char sizebuf[TEMP_BUF_SIZE]; -+ char encodingbuf[TEMP_BUF_SIZE]; - char *found; - - found = names[0]; - -- name_part(found, name); -- style_part(found, style); -- size_part(found, size, data->in_pixels); -- encoding_part(found, encoding); -- -- if (strlen(name) > 0 -- && strlen(style) > 0 -- && strlen(size) > 0 -- && strlen(encoding) > 0) -+ name_part(found, namebuf); -+ style_part(found, stylebuf); -+ size_part(found, sizebuf, data->in_pixels); -+ encoding_part(found, encodingbuf); -+ -+ if (strlen(namebuf) > 0 -+ && strlen(stylebuf) > 0 -+ && strlen(sizebuf) > 0 -+ && strlen(encodingbuf) > 0) - { -- data->sel[NAME] = XtNewString(name); -- data->sel[STYLE] = XtNewString(style); -- data->sel[SIZE] = XtNewString(size); -- data->sel[ENCODING] = XtNewString(encoding); -+ data->sel[NAME] = XtNewString(namebuf); -+ data->sel[STYLE] = XtNewString(stylebuf); -+ data->sel[SIZE] = XtNewString(sizebuf); -+ data->sel[ENCODING] = XtNewString(encodingbuf); - data->font_name = XtNewString(names[0]); - display_sample(data); - XmTextSetString(data->name, data->font_name); - } - else -@@ -1273,17 +1272,16 @@ gui_xm_select_font(char_u *current) - /* modal event loop */ - while (!data->exit) - XtAppProcessEvent(XtWidgetToApplicationContext(data->dialog), - (XtInputMask)XtIMAll); - -- XtDestroyWidget(data->dialog); -- - if (data->old) - { - XFreeFont(XtDisplay(data->dialog), data->old); - XmFontListFree(data->old_list); - } -+ XtDestroyWidget(data->dialog); - - gui_motif_synch_fonts(); - - return (char_u *) data->font_name; - } ---- vim72.orig/src/gui_xmebw.c -+++ vim72/src/gui_xmebw.c -@@ -233,17 +233,16 @@ bump_color(unsigned short value) - int tmp = 2 * (((int) value - 65535) / 3) + 65535; - - return tmp; - } - --/*ARGSUSED*/ - static int - alloc_color(Display *display, - Colormap colormap, - char *colorname, - XColor *xcolor, -- void *closure) -+ void *closure UNUSED) - { - int status; - - if (colorname) - if (!XParseColor(display, colormap, colorname, xcolor)) -@@ -593,13 +592,14 @@ draw_unhighlight(XmEnhancedButtonWidget - else - XmeClearBorder(XtDisplay(eb), XtWindow(eb), 0, 0, XtWidth(eb), - XtHeight(eb), eb->primitive.highlight_thickness); - } - --/*ARGSUSED*/ - static void --draw_pixmap(XmEnhancedButtonWidget eb, XEvent *event, Region region) -+draw_pixmap(XmEnhancedButtonWidget eb, -+ XEvent *event UNUSED, -+ Region region UNUSED) - { - Pixmap pix; - GC gc = eb->label.normal_GC; - int depth; - Cardinal width; -@@ -639,11 +639,11 @@ draw_pixmap(XmEnhancedButtonWidget eb, X - if (w < width) - width = w; - height = eb->core.height - 2 * y; - if (h < height) - height = h; -- if (depth == eb->core.depth) -+ if (depth == (int)eb->core.depth) - XCopyArea(XtDisplay(eb), pix, XtWindow(eb), gc, 0, 0, - width, height, x, y); - else if (depth == 1) - XCopyPlane(XtDisplay(eb), pix, XtWindow(eb), gc, 0, 0, - width, height, x, y, (unsigned long)1); -@@ -729,13 +729,15 @@ draw_label(XmEnhancedButtonWidget eb, XE - - if (replaceGC) - eb->label.normal_GC = tmp_gc; - } - --/*ARGSUSED*/ - static void --Enter(Widget wid, XEvent *event, String *params, Cardinal *num_params) -+Enter(Widget wid, -+ XEvent *event, -+ String *params UNUSED, -+ Cardinal *num_params UNUSED) - { - XmEnhancedButtonWidget eb = (XmEnhancedButtonWidget) wid; - XmPushButtonCallbackStruct call_value; - - if (Lab_IsMenupane(eb)) -@@ -816,13 +818,15 @@ Enter(Widget wid, XEvent *event, String - draw_shadows(eb); - draw_pixmap(eb, event, NULL); - } - } - --/*ARGSUSED*/ - static void --Leave(Widget wid, XEvent *event, String *params, Cardinal *num_params) -+Leave(Widget wid, -+ XEvent *event, -+ String *params UNUSED, -+ Cardinal *num_params UNUSED) - { - XmEnhancedButtonWidget eb = (XmEnhancedButtonWidget)wid; - XmPushButtonCallbackStruct call_value; - - if (Lab_IsMenupane(eb)) -@@ -974,13 +978,12 @@ set_size(XmEnhancedButtonWidget newtb) - - (* resize) ((Widget) newtb); - } - } - --/*ARGSUSED*/ - static void --Initialize(Widget rq, Widget ebw, ArgList args, Cardinal *n) -+Initialize(Widget rq, Widget ebw, ArgList args UNUSED, Cardinal *n UNUSED) - { - XmEnhancedButtonWidget request = (XmEnhancedButtonWidget)rq; - XmEnhancedButtonWidget eb = (XmEnhancedButtonWidget)ebw; - XtWidgetProc resize; - -@@ -1054,13 +1057,16 @@ Destroy(Widget w) - return; - - free_pixmaps((XmEnhancedButtonWidget)w); - } - --/*ARGSUSED*/ - static Boolean --SetValues(Widget current, Widget request, Widget new, ArgList args, Cardinal *n) -+SetValues(Widget current, -+ Widget request UNUSED, -+ Widget new, -+ ArgList args UNUSED, -+ Cardinal *n UNUSED) - { - XmEnhancedButtonWidget cur = (XmEnhancedButtonWidget) current; - XmEnhancedButtonWidget eb = (XmEnhancedButtonWidget) new; - Boolean redraw = False; - Boolean change = True; -@@ -1106,11 +1112,11 @@ SetValues(Widget current, Widget request - if (root == root_q) - { - if ((win_x < 0) || (win_y < 0)) - return False; - -- if ((win_x > r_width) || (win_y > r_height)) -+ if ((win_x > (int)r_width) || (win_y > (int)r_height)) - return False; - draw_highlight(eb); - draw_shadows(eb); - } - } -@@ -1254,11 +1260,11 @@ Redisplay(Widget w, XEvent *event, Regio - ->primitive_class.border_highlight))(w); - draw_pixmap(eb, event, region); - } - else - { -- int adjust = 0; -+ adjust = 0; - - #if !defined(LESSTIF_VERSION) && (XmVersion > 1002) - /* - * NOTE: PushButton has two types of shadows: primitive-shadow and - * default-button-shadow. If pushbutton is in a menu only primitive -@@ -1266,16 +1272,15 @@ Redisplay(Widget w, XEvent *event, Regio - */ - switch (default_button_emphasis) - { - case XmEXTERNAL_HIGHLIGHT: - adjust = (eb->primitive.highlight_thickness - -- (eb->pushbutton.default_button_shadow_thickness ? -- Xm3D_ENHANCE_PIXEL : 0)); -+ (eb->pushbutton.default_button_shadow_thickness -+ ? Xm3D_ENHANCE_PIXEL : 0)); - break; - - case XmINTERNAL_HIGHLIGHT: -- adjust = 0; - break; - - default: - assert(FALSE); - return; ---- vim72.orig/src/gvim.exe.mnf -+++ vim72/src/gvim.exe.mnf -@@ -1,7 +1,7 @@ - <?xml version="1.0" encoding="UTF-8" standalone="yes"?> --<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> -+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" > - <assemblyIdentity - processorArchitecture="*" - version="7.2.0.0" - type="win32" - name="Vim" -@@ -27,6 +27,12 @@ - level="asInvoker" - uiAccess="false"/> - </requestedPrivileges> - </security> - </trustInfo> -+ <!-- Vista High DPI aware --> -+ <asmv3:application> -+ <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> -+ <dpiAware>true</dpiAware> -+ </asmv3:windowsSettings> -+ </asmv3:application> - </assembly> ---- vim72.orig/src/hardcopy.c -+++ vim72/src/hardcopy.c -@@ -440,16 +440,15 @@ prt_get_unit(idx) - } - - /* - * Print the page header. - */ --/*ARGSUSED*/ - static void - prt_header(psettings, pagenum, lnum) - prt_settings_T *psettings; - int pagenum; -- linenr_T lnum; -+ linenr_T lnum UNUSED; - { - int width = psettings->chars_per_line; - int page_line; - char_u *tbuf; - char_u *p; -@@ -1879,11 +1878,11 @@ prt_next_dsc(p_dsc_line) - /* DSC comments always start %% */ - if (prt_resfile_strncmp(0, "%%", 2) != 0) - return FALSE; - - /* Find type of DSC comment */ -- for (comment = 0; comment < NUM_ELEMENTS(prt_dsc_table); comment++) -+ for (comment = 0; comment < (int)NUM_ELEMENTS(prt_dsc_table); comment++) - if (prt_resfile_strncmp(0, prt_dsc_table[comment].string, - prt_dsc_table[comment].len) == 0) - break; - - if (comment != NUM_ELEMENTS(prt_dsc_table)) -@@ -2452,16 +2451,15 @@ prt_match_charset(p_charset, p_cmap, pp_ - } - return FALSE; - } - #endif - --/*ARGSUSED*/ - int - mch_print_init(psettings, jobname, forceit) - prt_settings_T *psettings; - char_u *jobname; -- int forceit; -+ int forceit UNUSED; - { - int i; - char *paper_name; - int paper_strlen; - int fontsize; -@@ -2512,11 +2510,11 @@ mch_print_init(psettings, jobname, force - p_mbenc = NULL; - props = enc_canon_props(p_encoding); - if (!(props & ENC_8BIT) && ((*p_pmcs != NUL) || !(props & ENC_UNICODE))) - { - p_mbenc_first = NULL; -- for (cmap = 0; cmap < NUM_ELEMENTS(prt_ps_mbfonts); cmap++) -+ for (cmap = 0; cmap < (int)NUM_ELEMENTS(prt_ps_mbfonts); cmap++) - if (prt_match_encoding((char *)p_encoding, &prt_ps_mbfonts[cmap], - &p_mbenc)) - { - if (p_mbenc_first == NULL) - p_mbenc_first = p_mbenc; -@@ -2640,11 +2638,11 @@ mch_print_init(psettings, jobname, force - else - { - paper_name = "A4"; - paper_strlen = 2; - } -- for (i = 0; i < PRT_MEDIASIZE_LEN; ++i) -+ for (i = 0; i < (int)PRT_MEDIASIZE_LEN; ++i) - if (STRLEN(prt_mediasize[i].name) == (unsigned)paper_strlen - && STRNICMP(prt_mediasize[i].name, paper_name, - paper_strlen) == 0) - break; - if (i == PRT_MEDIASIZE_LEN) -@@ -3306,14 +3304,13 @@ mch_print_end_page() - prt_dsc_noarg("PageTrailer"); - - return !prt_file_error; - } - --/*ARGSUSED*/ - int - mch_print_begin_page(str) -- char_u *str; -+ char_u *str UNUSED; - { - int page_num[2]; - - prt_page_num++; - -@@ -3377,15 +3374,14 @@ mch_print_start_line(margin, page_line) - #ifdef FEAT_MBYTE - prt_half_width = FALSE; - #endif - } - --/*ARGSUSED*/ - int - mch_print_text_out(p, len) - char_u *p; -- int len; -+ int len UNUSED; - { - int need_break; - char_u ch; - char_u ch_buff[8]; - float char_width; ---- vim72.orig/src/if_cscope.c -+++ vim72/src/if_cscope.c -@@ -44,11 +44,10 @@ static void cs_file_results __ARGS(( - static void cs_fill_results __ARGS((char *, int , int *, char ***, - char ***, int *)); - static int cs_find __ARGS((exarg_T *eap)); - static int cs_find_common __ARGS((char *opt, char *pat, int, int, int)); - static int cs_help __ARGS((exarg_T *eap)); --static void cs_init __ARGS((void)); - static void clear_csinfo __ARGS((int i)); - static int cs_insert_filelist __ARGS((char *, char *, char *, - struct stat *)); - static int cs_kill __ARGS((exarg_T *eap)); - static void cs_kill_execute __ARGS((int, char *)); -@@ -64,52 +63,167 @@ static void cs_release_csp __ARGS((i - static int cs_reset __ARGS((exarg_T *eap)); - static char * cs_resolve_file __ARGS((int, char *)); - static int cs_show __ARGS((exarg_T *eap)); - - --static csinfo_T csinfo[CSCOPE_MAX_CONNECTIONS]; -+static csinfo_T * csinfo = NULL; -+static int csinfo_size = 0; /* number of items allocated in -+ csinfo[] */ -+ - static int eap_arg_len; /* length of eap->arg, set in - cs_lookup_cmd() */ - static cscmd_T cs_cmds[] = - { - { "add", cs_add, - N_("Add a new database"), "add file|dir [pre-path] [flags]", 0 }, - { "find", cs_find, -- N_("Query for a pattern"), FIND_USAGE, 1 }, -+ N_("Query for a pattern"), "find c|d|e|f|g|i|s|t name", 1 }, - { "help", cs_help, - N_("Show this message"), "help", 0 }, - { "kill", cs_kill, - N_("Kill a connection"), "kill #", 0 }, - { "reset", cs_reset, - N_("Reinit all connections"), "reset", 0 }, - { "show", cs_show, - N_("Show connections"), "show", 0 }, -- { NULL } -+ { NULL, NULL, NULL, NULL, 0 } - }; - - static void - cs_usage_msg(x) - csid_e x; - { - (void)EMSG2(_("E560: Usage: cs[cope] %s"), cs_cmds[(int)x].usage); - } - -+#if defined(FEAT_CMDL_COMPL) || defined(PROTO) -+ -+static enum -+{ -+ EXP_CSCOPE_SUBCMD, /* expand ":cscope" sub-commands */ -+ EXP_SCSCOPE_SUBCMD, /* expand ":scscope" sub-commands */ -+ EXP_CSCOPE_FIND, /* expand ":cscope find" arguments */ -+ EXP_CSCOPE_KILL /* expand ":cscope kill" arguments */ -+} expand_what; -+ -+/* -+ * Function given to ExpandGeneric() to obtain the cscope command -+ * expansion. -+ */ -+ char_u * -+get_cscope_name(xp, idx) -+ expand_T *xp UNUSED; -+ int idx; -+{ -+ int current_idx; -+ int i; -+ -+ switch (expand_what) -+ { -+ case EXP_CSCOPE_SUBCMD: -+ /* Complete with sub-commands of ":cscope": -+ * add, find, help, kill, reset, show */ -+ return (char_u *)cs_cmds[idx].name; -+ case EXP_SCSCOPE_SUBCMD: -+ /* Complete with sub-commands of ":scscope": same sub-commands as -+ * ":cscope" but skip commands which don't support split windows */ -+ for (i = 0, current_idx = 0; cs_cmds[i].name != NULL; i++) -+ if (cs_cmds[i].cansplit) -+ if (current_idx++ == idx) -+ break; -+ return (char_u *)cs_cmds[i].name; -+ case EXP_CSCOPE_FIND: -+ { -+ const char *query_type[] = -+ { -+ "c", "d", "e", "f", "g", "i", "s", "t", NULL -+ }; -+ -+ /* Complete with query type of ":cscope find {query_type}". -+ * {query_type} can be letters (c, d, ... t) or numbers (0, 1, -+ * ..., 8) but only complete with letters, since numbers are -+ * redundant. */ -+ return (char_u *)query_type[idx]; -+ } -+ case EXP_CSCOPE_KILL: -+ { -+ static char connection[5]; -+ -+ /* ":cscope kill" accepts connection numbers or partial names of -+ * the pathname of the cscope database as argument. Only complete -+ * with connection numbers. -1 can also be used to kill all -+ * connections. */ -+ for (i = 0, current_idx = 0; i < csinfo_size; i++) -+ { -+ if (csinfo[i].fname == NULL) -+ continue; -+ if (current_idx++ == idx) -+ { -+ vim_snprintf(connection, sizeof(connection), "%d", i); -+ return (char_u *)connection; -+ } -+ } -+ return (current_idx == idx && idx > 0) ? (char_u *)"-1" : NULL; -+ } -+ default: -+ return NULL; -+ } -+} -+ -+/* -+ * Handle command line completion for :cscope command. -+ */ -+ void -+set_context_in_cscope_cmd(xp, arg, cmdidx) -+ expand_T *xp; -+ char_u *arg; -+ cmdidx_T cmdidx; -+{ -+ char_u *p; -+ -+ /* Default: expand subcommands */ -+ xp->xp_context = EXPAND_CSCOPE; -+ xp->xp_pattern = arg; -+ expand_what = (cmdidx == CMD_scscope) -+ ? EXP_SCSCOPE_SUBCMD : EXP_CSCOPE_SUBCMD; -+ -+ /* (part of) subcommand already typed */ -+ if (*arg != NUL) -+ { -+ p = skiptowhite(arg); -+ if (*p != NUL) /* past first word */ -+ { -+ xp->xp_pattern = skipwhite(p); -+ if (*skiptowhite(xp->xp_pattern) != NUL) -+ xp->xp_context = EXPAND_NOTHING; -+ else if (STRNICMP(arg, "add", p - arg) == 0) -+ xp->xp_context = EXPAND_FILES; -+ else if (STRNICMP(arg, "kill", p - arg) == 0) -+ expand_what = EXP_CSCOPE_KILL; -+ else if (STRNICMP(arg, "find", p - arg) == 0) -+ expand_what = EXP_CSCOPE_FIND; -+ else -+ xp->xp_context = EXPAND_NOTHING; -+ } -+ } -+} -+ -+#endif /* FEAT_CMDL_COMPL */ -+ - /* - * PRIVATE: do_cscope_general - * -- * find the command, print help if invalid, and the then call the -- * corresponding command function, -- * called from do_cscope and do_scscope -+ * Find the command, print help if invalid, and then call the corresponding -+ * command function. - */ - static void - do_cscope_general(eap, make_split) - exarg_T *eap; - int make_split; /* whether to split window */ - { - cscmd_T *cmdp; - -- cs_init(); - if ((cmdp = cs_lookup_cmd(eap)) == NULL) - { - cs_help(eap); - return; - } -@@ -166,12 +280,10 @@ do_scscope(eap) - do_cstag(eap) - exarg_T *eap; - { - int ret = FALSE; - -- cs_init(); -- - if (*eap->arg == NUL) - { - (void)EMSG(_("E562: Usage: cstag <ident>")); - return; - } -@@ -323,11 +435,11 @@ cs_connection(num, dbpath, ppath) - int i; - - if (num < 0 || num > 4 || (num > 0 && !dbpath)) - return FALSE; - -- for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++) -+ for (i = 0; i < csinfo_size; i++) - { - if (!csinfo[i].fname) - continue; - - if (num == 0) -@@ -377,14 +489,13 @@ cs_connection(num, dbpath, ppath) - * add cscope database or a directory name (to look for cscope.out) - * to the cscope connection list - * - * MAXPATHL 256 - */ --/* ARGSUSED */ - static int - cs_add(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - char *fname, *ppath, *flags = NULL; - - if ((fname = strtok((char *)NULL, (const char *)" ")) == NULL) - { -@@ -567,11 +678,11 @@ cs_check_for_tags() - cs_cnt_connections() - { - short i; - short cnt = 0; - -- for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++) -+ for (i = 0; i < csinfo_size; i++) - { - if (csinfo[i].fname != NULL) - cnt++; - } - return cnt; -@@ -657,10 +768,11 @@ cs_create_cmd(csoption, pattern) - char *csoption; - char *pattern; - { - char *cmd; - short search; -+ char *pat; - - switch (csoption[0]) - { - case '0' : case 's' : - search = 0; -@@ -690,14 +802,21 @@ cs_create_cmd(csoption, pattern) - (void)EMSG(_("E561: unknown cscope search type")); - cs_usage_msg(Find); - return NULL; - } - -- if ((cmd = (char *)alloc((unsigned)(strlen(pattern) + 2))) == NULL) -+ /* Skip white space before the patter, except for text and pattern search, -+ * they may want to use the leading white space. */ -+ pat = pattern; -+ if (search != 4 && search != 6) -+ while vim_iswhite(*pat) -+ ++pat; -+ -+ if ((cmd = (char *)alloc((unsigned)(strlen(pat) + 2))) == NULL) - return NULL; - -- (void)sprintf(cmd, "%d%s", search, pattern); -+ (void)sprintf(cmd, "%d%s", search, pat); - - return cmd; - } /* cs_create_cmd */ - - -@@ -867,11 +986,11 @@ err_closing: - vim_free(prog); - # endif - vim_free(ppath); - - #if defined(UNIX) -- if (execl("/bin/sh", "sh", "-c", cmd, NULL) == -1) -+ if (execl("/bin/sh", "sh", "-c", cmd, (char *)NULL) == -1) - PERROR(_("cs_create_connection exec failed")); - - exit(127); - /* NOTREACHED */ - default: /* parent. */ -@@ -987,28 +1106,33 @@ cs_find_common(opt, pat, forceit, verbos - int verbose; - int use_ll; - { - int i; - char *cmd; -- int nummatches[CSCOPE_MAX_CONNECTIONS], totmatches; -+ int *nummatches; -+ int totmatches; - #ifdef FEAT_QUICKFIX - char cmdletter; - char *qfpos; - #endif - - /* create the actual command to send to cscope */ - cmd = cs_create_cmd(opt, pat); - if (cmd == NULL) - return FALSE; - -+ nummatches = (int *)alloc(sizeof(int)*csinfo_size); -+ if (nummatches == NULL) -+ return FALSE; -+ - /* send query to all open connections, then count the total number - * of matches so we can alloc matchesp all in one swell foop - */ -- for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++) -+ for (i = 0; i < csinfo_size; i++) - nummatches[i] = 0; - totmatches = 0; -- for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++) -+ for (i = 0; i < csinfo_size; i++) - { - if (csinfo[i].fname == NULL || csinfo[i].to_fp == NULL) - continue; - - /* send cmd to cscope */ -@@ -1029,21 +1153,25 @@ cs_find_common(opt, pat, forceit, verbos - { - char *nf = _("E259: no matches found for cscope query %s of %s"); - char *buf; - - if (!verbose) -+ { -+ vim_free(nummatches); - return FALSE; -+ } - - buf = (char *)alloc((unsigned)(strlen(opt) + strlen(pat) + strlen(nf))); - if (buf == NULL) - (void)EMSG(nf); - else - { - sprintf(buf, nf, opt, pat); - (void)EMSG(buf); - vim_free(buf); - } -+ vim_free(nummatches); - return FALSE; - } - - #ifdef FEAT_QUICKFIX - /* get cmd letter */ -@@ -1092,10 +1220,11 @@ cs_find_common(opt, pat, forceit, verbos - { - sprintf(buf, nf, *qfpos, *(qfpos-1)); - (void)EMSG(buf); - vim_free(buf); - } -+ vim_free(nummatches); - return FALSE; - } - } - if (qfpos != NULL && *qfpos != '0' && totmatches > 0) - { -@@ -1139,10 +1268,11 @@ cs_find_common(opt, pat, forceit, verbos - qf_jump(qi, 0, 0, forceit); - } - } - mch_remove(tmp); - vim_free(tmp); -+ vim_free(nummatches); - return TRUE; - } - else - #endif /* FEAT_QUICKFIX */ - { -@@ -1150,10 +1280,11 @@ cs_find_common(opt, pat, forceit, verbos - int matched = 0; - - /* read output */ - cs_fill_results((char *)pat, totmatches, nummatches, &matches, - &contexts, &matched); -+ vim_free(nummatches); - if (matches == NULL) - return FALSE; - - (void)cs_manage_matches(matches, contexts, matched, Store); - -@@ -1165,52 +1296,48 @@ cs_find_common(opt, pat, forceit, verbos - /* - * PRIVATE: cs_help - * - * print help - */ --/* ARGSUSED */ - static int - cs_help(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - cscmd_T *cmdp = cs_cmds; - - (void)MSG_PUTS(_("cscope commands:\n")); - while (cmdp->name != NULL) - { -- (void)smsg((char_u *)_("%-5s: %-30s (Usage: %s)"), -- cmdp->name, _(cmdp->help), cmdp->usage); -+ char *help = _(cmdp->help); -+ int space_cnt = 30 - vim_strsize((char_u *)help); -+ -+ /* Use %*s rather than %30s to ensure proper alignment in utf-8 */ -+ if (space_cnt < 0) -+ space_cnt = 0; -+ (void)smsg((char_u *)_("%-5s: %s%*s (Usage: %s)"), -+ cmdp->name, -+ help, space_cnt, " ", -+ cmdp->usage); - if (strcmp(cmdp->name, "find") == 0) -- MSG_PUTS(FIND_HELP); -+ MSG_PUTS(_("\n" -+ " c: Find functions calling this function\n" -+ " d: Find functions called by this function\n" -+ " e: Find this egrep pattern\n" -+ " f: Find this file\n" -+ " g: Find this definition\n" -+ " i: Find files #including this file\n" -+ " s: Find this C symbol\n" -+ " t: Find assignments to\n")); -+ - cmdp++; - } - - wait_return(TRUE); - return 0; - } /* cs_help */ - - --/* -- * PRIVATE: cs_init -- * -- * initialize cscope structure if not already -- */ -- static void --cs_init() --{ -- short i; -- static int init_already = FALSE; -- -- if (init_already) -- return; -- -- for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++) -- clear_csinfo(i); -- -- init_already = TRUE; --} /* cs_init */ -- - static void - clear_csinfo(i) - int i; - { - csinfo[i].fname = NULL; -@@ -1255,17 +1382,16 @@ GetWin32Error() - /* - * PRIVATE: cs_insert_filelist - * - * insert a new cscope database filename into the filelist - */ --/*ARGSUSED*/ - static int - cs_insert_filelist(fname, ppath, flags, sb) - char *fname; - char *ppath; - char *flags; -- struct stat *sb; -+ struct stat *sb UNUSED; - { - short i, j; - #ifndef UNIX - HANDLE hFile; - BY_HANDLE_FILE_INFORMATION bhfi; -@@ -1304,11 +1430,11 @@ cs_insert_filelist(fname, ppath, flags, - CloseHandle(hFile); - } - #endif - - i = -1; /* can be set to the index of an empty item in csinfo */ -- for (j = 0; j < CSCOPE_MAX_CONNECTIONS; j++) -+ for (j = 0; j < csinfo_size; j++) - { - if (csinfo[j].fname != NULL - #if defined(UNIX) - && csinfo[j].st_dev == sb->st_dev && csinfo[j].st_ino == sb->st_ino - #else -@@ -1331,13 +1457,29 @@ cs_insert_filelist(fname, ppath, flags, - i = j; /* remember first empty entry */ - } - - if (i == -1) - { -- if (p_csverbose) -- (void)EMSG(_("E569: maximum number of cscope connections reached")); -- return -1; -+ i = csinfo_size; -+ if (csinfo_size == 0) -+ { -+ /* First time allocation: allocate only 1 connection. It should -+ * be enough for most users. If more is needed, csinfo will be -+ * reallocated. */ -+ csinfo_size = 1; -+ csinfo = (csinfo_T *)alloc_clear(sizeof(csinfo_T)); -+ } -+ else -+ { -+ /* Reallocate space for more connections. */ -+ csinfo_size *= 2; -+ csinfo = vim_realloc(csinfo, sizeof(csinfo_T)*csinfo_size); -+ } -+ if (csinfo == NULL) -+ return -1; -+ for (j = csinfo_size/2; j < csinfo_size; j++) -+ clear_csinfo(j); - } - - if ((csinfo[i].fname = (char *)alloc((unsigned)strlen(fname)+1)) == NULL) - return -1; - -@@ -1417,14 +1559,13 @@ cs_lookup_cmd(eap) - /* - * PRIVATE: cs_kill - * - * nuke em - */ --/* ARGSUSED */ - static int - cs_kill(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - char *stok; - short i; - - if ((stok = strtok((char *)NULL, (const char *)" ")) == NULL) -@@ -1441,28 +1582,27 @@ cs_kill(eap) - else - { - /* It must be part of a name. We will try to find a match - * within all the names in the csinfo data structure - */ -- for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++) -+ for (i = 0; i < csinfo_size; i++) - { - if (csinfo[i].fname != NULL && strstr(csinfo[i].fname, stok)) - break; - } - } - -- if ((i >= CSCOPE_MAX_CONNECTIONS || i < -1 || csinfo[i].fname == NULL) -- && i != -1) -+ if ((i != -1) && (i >= csinfo_size || i < -1 || csinfo[i].fname == NULL)) - { - if (p_csverbose) - (void)EMSG2(_("E261: cscope connection %s not found"), stok); - } - else - { - if (i == -1) - { -- for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++) -+ for (i = 0; i < csinfo_size; i++) - { - if (csinfo[i].fname) - cs_kill_execute(i, csinfo[i].fname); - } - } -@@ -1718,11 +1858,11 @@ cs_file_results(f, nummatches_a) - - buf = (char *)alloc(CSREAD_BUFSIZE); - if (buf == NULL) - return; - -- for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++) -+ for (i = 0; i < csinfo_size; i++) - { - if (nummatches_a[i] < 1) - continue; - - for (j = 0; j < nummatches_a[i]; j++) -@@ -1790,11 +1930,11 @@ cs_fill_results(tagstr, totmatches, numm - if ((matches = (char **)alloc(sizeof(char *) * totmatches)) == NULL) - goto parse_out; - if ((cntxts = (char **)alloc(sizeof(char *) * totmatches)) == NULL) - goto parse_out; - -- for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++) -+ for (i = 0; i < csinfo_size; i++) - { - if (nummatches_a[i] < 1) - continue; - - for (j = 0; j < nummatches_a[i]; j++) -@@ -1927,11 +2067,11 @@ cs_print_tags_priv(matches, cntxts, num_ - */ - if ((tbuf = (char *)alloc((unsigned)strlen(matches[idx]) + 1)) == NULL) - continue; - (void)strcpy(tbuf, matches[idx]); - -- if ((fname = strtok(tbuf, (const char *)"\t")) == NULL) -+ if (strtok(tbuf, (const char *)"\t") == NULL) - continue; - if ((fname = strtok(NULL, (const char *)"\t")) == NULL) - continue; - if ((lno = strtok(NULL, (const char *)"\t")) == NULL) - continue; -@@ -2097,11 +2237,10 @@ cs_read_prompt(i) - - #if defined(UNIX) && defined(SIGALRM) - /* - * Used to catch and ignore SIGALRM below. - */ --/* ARGSUSED */ - static RETSIGTYPE - sig_handler SIGDEFARG(sigarg) - { - /* do nothing */ - SIGRETURN; -@@ -2137,11 +2276,15 @@ cs_release_csp(i, freefnpp) - struct sigaction sa, old; - - /* Use sigaction() to limit the waiting time to two seconds. */ - sigemptyset(&sa.sa_mask); - sa.sa_handler = sig_handler; -+# ifdef SA_NODEFER - sa.sa_flags = SA_NODEFER; -+# else -+ sa.sa_flags = 0; -+# endif - sigaction(SIGALRM, &sa, &old); - alarm(2); /* 2 sec timeout */ - - /* Block until cscope exits or until timer expires */ - pid = waitpid(csinfo[i].pid, &pstat, 0); -@@ -2237,42 +2380,44 @@ cs_release_csp(i, freefnpp) - /* - * PRIVATE: cs_reset - * - * calls cs_kill on all cscope connections then reinits - */ --/* ARGSUSED */ - static int - cs_reset(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - char **dblist = NULL, **pplist = NULL, **fllist = NULL; - int i; - char buf[20]; /* for sprintf " (#%d)" */ - -+ if (csinfo_size == 0) -+ return CSCOPE_SUCCESS; -+ - /* malloc our db and ppath list */ -- dblist = (char **)alloc(CSCOPE_MAX_CONNECTIONS * sizeof(char *)); -- pplist = (char **)alloc(CSCOPE_MAX_CONNECTIONS * sizeof(char *)); -- fllist = (char **)alloc(CSCOPE_MAX_CONNECTIONS * sizeof(char *)); -+ dblist = (char **)alloc(csinfo_size * sizeof(char *)); -+ pplist = (char **)alloc(csinfo_size * sizeof(char *)); -+ fllist = (char **)alloc(csinfo_size * sizeof(char *)); - if (dblist == NULL || pplist == NULL || fllist == NULL) - { - vim_free(dblist); - vim_free(pplist); - vim_free(fllist); - return CSCOPE_FAILURE; - } - -- for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++) -+ for (i = 0; i < csinfo_size; i++) - { - dblist[i] = csinfo[i].fname; - pplist[i] = csinfo[i].ppath; - fllist[i] = csinfo[i].flags; - if (csinfo[i].fname != NULL) - cs_release_csp(i, FALSE); - } - - /* rebuild the cscope connection list */ -- for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++) -+ for (i = 0; i < csinfo_size; i++) - { - if (dblist[i] != NULL) - { - cs_add_common(dblist[i], pplist[i], fllist[i]); - if (p_csverbose) -@@ -2353,24 +2498,23 @@ cs_resolve_file(i, name) - /* - * PRIVATE: cs_show - * - * show all cscope connections - */ --/* ARGSUSED */ - static int - cs_show(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - short i; - if (cs_cnt_connections() == 0) - MSG_PUTS(_("no cscope connections\n")); - else - { - MSG_PUTS_ATTR( - _(" # pid database name prepend path\n"), - hl_attr(HLF_T)); -- for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++) -+ for (i = 0; i < csinfo_size; i++) - { - if (csinfo[i].fname == NULL) - continue; - - if (csinfo[i].ppath != NULL) -@@ -2395,12 +2539,14 @@ cs_show(eap) - void - cs_end() - { - int i; - -- for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++) -+ for (i = 0; i < csinfo_size; i++) - cs_release_csp(i, TRUE); -+ vim_free(csinfo); -+ csinfo_size = 0; - } - - #endif /* FEAT_CSCOPE */ - - /* the end */ ---- vim72.orig/src/if_cscope.h -+++ vim72/src/if_cscope.h -@@ -23,11 +23,10 @@ - # endif - #endif - - #define CSCOPE_SUCCESS 0 - #define CSCOPE_FAILURE -1 --#define CSCOPE_MAX_CONNECTIONS 8 /* you actually need more? */ - - #define CSCOPE_DBFILE "cscope.out" - #define CSCOPE_PROMPT ">> " - - /* -@@ -40,21 +39,10 @@ - * 5pattern change pattern -- NOT USED - * e 6pattern Find this egrep pattern - * f 7name Find this file - * i 8name Find files #including this file - */ --#define FIND_USAGE "find c|d|e|f|g|i|s|t name" --#define FIND_HELP "\n\ -- c: Find functions calling this function\n\ -- d: Find functions called by this function\n\ -- e: Find this egrep pattern\n\ -- f: Find this file\n\ -- g: Find this definition\n\ -- i: Find files #including this file\n\ -- s: Find this C symbol\n\ -- t: Find assignments to\n" -- - - typedef struct { - char * name; - int (*func) __ARGS((exarg_T *eap)); - char * help; ---- vim72.orig/src/if_mzsch.c -+++ vim72/src/if_mzsch.c -@@ -2,10 +2,12 @@ - * - * MzScheme interface by Sergey Khorev <sergey.khorev@gmail.com> - * Original work by Brent Fulgham <bfulgham@debian.org> - * (Based on lots of help from Matthew Flatt) - * -+ * TODO Convert byte-strings to char strings? -+ * - * This consists of six parts: - * 1. MzScheme interpreter main program - * 2. Routines that handle the external interface between MzScheme and - * Vim. - * 3. MzScheme input/output handlers: writes output via [e]msg(). -@@ -16,37 +18,38 @@ - * NOTES - * 1. Memory, allocated with scheme_malloc*, need not to be freed explicitly, - * garbage collector will do it self - * 2. Requires at least NORMAL features. I can't imagine why one may want - * to build with SMALL or TINY features but with MzScheme interface. -- * 3. I don't use K&R-style functions. Anyway, MzScheme headers are ANSI. -+ * 3. I don't use K&R-style functions. Anyways, MzScheme headers are ANSI. - */ - - #include "vim.h" - - #include "if_mzsch.h" - - /* Only do the following when the feature is enabled. Needed for "make - * depend". */ - #if defined(FEAT_MZSCHEME) || defined(PROTO) - -+#include <assert.h> -+ - /* Base data structures */ - #define SCHEME_VIMBUFFERP(obj) SAME_TYPE(SCHEME_TYPE(obj), mz_buffer_type) - #define SCHEME_VIMWINDOWP(obj) SAME_TYPE(SCHEME_TYPE(obj), mz_window_type) - - typedef struct - { -- Scheme_Type tag; -- Scheme_Env *env; -+ Scheme_Object so; - buf_T *buf; - } vim_mz_buffer; - - #define INVALID_BUFFER_VALUE ((buf_T *)(-1)) - - typedef struct - { -- Scheme_Type tag; -+ Scheme_Object so; - win_T *win; - } vim_mz_window; - - #define INVALID_WINDOW_VALUE ((win_T *)(-1)) - -@@ -65,31 +68,10 @@ typedef struct - { - char *name; - Scheme_Object *port; - } Port_Info; - --/* info for closed prim */ --/* -- * data have different means: -- * for do_eval it is char* -- * for do_apply is Apply_Onfo* -- * for do_load is Port_Info* -- */ --typedef struct --{ -- void *data; -- Scheme_Env *env; --} Cmd_Info; -- --/* info for do_apply */ --typedef struct --{ -- Scheme_Object *proc; -- int argc; -- Scheme_Object **argv; --} Apply_Info; -- - /* - *======================================================================== - * Vim-Control Commands - *======================================================================== - */ -@@ -120,11 +102,10 @@ static Scheme_Object *mzscheme_open_buff - static Scheme_Object *set_buffer_line(void *, int, Scheme_Object **); - static Scheme_Object *set_buffer_line_list(void *, int, Scheme_Object **); - static Scheme_Object *insert_buffer_line_list(void *, int, Scheme_Object **); - static Scheme_Object *get_range_start(void *, int, Scheme_Object **); - static Scheme_Object *get_range_end(void *, int, Scheme_Object **); --static Scheme_Object *get_buffer_namespace(void *, int, Scheme_Object **); - static vim_mz_buffer *get_vim_curr_buffer(void); - - /* Window-related commands */ - static Scheme_Object *window_new(win_T *win); - static Scheme_Object *get_curr_win(void *, int, Scheme_Object **); -@@ -161,34 +142,66 @@ static Scheme_Object *vim_window_validp( - */ - static int vim_error_check(void); - static int do_mzscheme_command(exarg_T *, void *, Scheme_Closed_Prim *what); - static void startup_mzscheme(void); - static char *string_to_line(Scheme_Object *obj); --static int mzscheme_io_init(void); --static void mzscheme_interface_init(vim_mz_buffer *self); - static void do_output(char *mesg, long len); - static void do_printf(char *format, ...); - static void do_flush(void); - static Scheme_Object *_apply_thunk_catch_exceptions( - Scheme_Object *, Scheme_Object **); - static Scheme_Object *extract_exn_message(Scheme_Object *v); - static Scheme_Object *do_eval(void *, int noargc, Scheme_Object **noargv); - static Scheme_Object *do_load(void *, int noargc, Scheme_Object **noargv); --static Scheme_Object *do_apply(void *, int noargc, Scheme_Object **noargv); --static void register_vim_exn(Scheme_Env *env); -+static void register_vim_exn(void); - static vim_mz_buffer *get_buffer_arg(const char *fname, int argnum, - int argc, Scheme_Object **argv); - static vim_mz_window *get_window_arg(const char *fname, int argnum, - int argc, Scheme_Object **argv); --static void add_vim_exn(Scheme_Env *env); - static int line_in_range(linenr_T, buf_T *); - static void check_line_range(linenr_T, buf_T *); - static void mz_fix_cursor(int lo, int hi, int extra); - --static int eval_in_namespace(void *, Scheme_Closed_Prim *, Scheme_Env *, -- Scheme_Object **ret); --static void make_modules(Scheme_Env *); -+static int eval_with_exn_handling(void *, Scheme_Closed_Prim *, -+ Scheme_Object **ret); -+static void make_modules(void); -+static void init_exn_catching_apply(void); -+static int mzscheme_env_main(Scheme_Env *env, int argc, char **argv); -+static int mzscheme_init(void); -+#ifdef FEAT_EVAL -+static Scheme_Object *vim_to_mzscheme(typval_T *vim_value, int depth, -+ Scheme_Hash_Table *visited); -+static int mzscheme_to_vim(Scheme_Object *obj, typval_T *tv, int depth, -+ Scheme_Hash_Table *visited); -+#endif -+ -+#ifdef MZ_PRECISE_GC -+static int buffer_size_proc(void *obj) -+{ -+ return gcBYTES_TO_WORDS(sizeof(vim_mz_buffer)); -+} -+static int buffer_mark_proc(void *obj) -+{ -+ return buffer_size_proc(obj); -+} -+static int buffer_fixup_proc(void *obj) -+{ -+ return buffer_size_proc(obj); -+} -+static int window_size_proc(void *obj) -+{ -+ return gcBYTES_TO_WORDS(sizeof(vim_mz_window)); -+} -+static int window_mark_proc(void *obj) -+{ -+ return window_size_proc(obj); -+} -+static int window_fixup_proc(void *obj) -+{ -+ return window_size_proc(obj); -+} -+#endif - - #ifdef DYNAMIC_MZSCHEME - - static Scheme_Object *dll_scheme_eof; - static Scheme_Object *dll_scheme_false; -@@ -258,12 +271,10 @@ static Scheme_Object *(*dll_scheme_looku - Scheme_Env *env); - static Scheme_Object *(*dll_scheme_make_closed_prim_w_arity) - (Scheme_Closed_Prim *prim, void *data, const char *name, mzshort mina, - mzshort maxa); - static Scheme_Object *(*dll_scheme_make_integer_value)(long i); --static Scheme_Object *(*dll_scheme_make_namespace)(int argc, -- Scheme_Object *argv[]); - static Scheme_Object *(*dll_scheme_make_pair)(Scheme_Object *car, - Scheme_Object *cdr); - static Scheme_Object *(*dll_scheme_make_prim_w_arity)(Scheme_Prim *prim, - const char *name, mzshort mina, mzshort maxa); - # if MZSCHEME_VERSION_MAJOR < 299 -@@ -309,10 +320,21 @@ static Scheme_Config *(*dll_scheme_curre - static Scheme_Object *(*dll_scheme_char_string_to_byte_string) - (Scheme_Object *s); - static Scheme_Object *(*dll_scheme_char_string_to_path) - (Scheme_Object *s); - # endif -+static Scheme_Hash_Table *(*dll_scheme_make_hash_table)(int type); -+static void (*dll_scheme_hash_set)(Scheme_Hash_Table *table, -+ Scheme_Object *key, Scheme_Object *value); -+static Scheme_Object *(*dll_scheme_hash_get)(Scheme_Hash_Table *table, -+ Scheme_Object *key); -+static Scheme_Object *(*dll_scheme_make_double)(double d); -+# ifdef INCLUDE_MZSCHEME_BASE -+static Scheme_Object *(*dll_scheme_make_sized_byte_string)(char *chars, -+ long len, int copy); -+static Scheme_Object *(*dll_scheme_namespace_require)(Scheme_Object *req); -+# endif - - /* arrays are imported directly */ - # define scheme_eof dll_scheme_eof - # define scheme_false dll_scheme_false - # define scheme_void dll_scheme_void -@@ -366,11 +388,10 @@ static Scheme_Object *(*dll_scheme_char_ - # endif - # define scheme_intern_symbol dll_scheme_intern_symbol - # define scheme_lookup_global dll_scheme_lookup_global - # define scheme_make_closed_prim_w_arity dll_scheme_make_closed_prim_w_arity - # define scheme_make_integer_value dll_scheme_make_integer_value --# define scheme_make_namespace dll_scheme_make_namespace - # define scheme_make_pair dll_scheme_make_pair - # define scheme_make_prim_w_arity dll_scheme_make_prim_w_arity - # if MZSCHEME_VERSION_MAJOR < 299 - # define scheme_make_string dll_scheme_make_string - # define scheme_make_string_output_port dll_scheme_make_string_output_port -@@ -401,10 +422,18 @@ static Scheme_Object *(*dll_scheme_char_ - # define scheme_char_string_to_byte_string \ - dll_scheme_char_string_to_byte_string - # define scheme_char_string_to_path \ - dll_scheme_char_string_to_path - # endif -+# define scheme_make_hash_table dll_scheme_make_hash_table -+# define scheme_hash_set dll_scheme_hash_set -+# define scheme_hash_get dll_scheme_hash_get -+# define scheme_make_double dll_scheme_make_double -+# ifdef INCLUDE_MZSCHEME_BASE -+# define scheme_make_sized_byte_string dll_scheme_make_sized_byte_string -+# define scheme_namespace_require dll_scheme_namespace_require -+# endif - - typedef struct - { - char *name; - void **ptr; -@@ -466,11 +495,10 @@ static Thunk_Info mzsch_imports[] = { - {"scheme_intern_symbol", (void **)&dll_scheme_intern_symbol}, - {"scheme_lookup_global", (void **)&dll_scheme_lookup_global}, - {"scheme_make_closed_prim_w_arity", - (void **)&dll_scheme_make_closed_prim_w_arity}, - {"scheme_make_integer_value", (void **)&dll_scheme_make_integer_value}, -- {"scheme_make_namespace", (void **)&dll_scheme_make_namespace}, - {"scheme_make_pair", (void **)&dll_scheme_make_pair}, - {"scheme_make_prim_w_arity", (void **)&dll_scheme_make_prim_w_arity}, - # if MZSCHEME_VERSION_MAJOR < 299 - {"scheme_make_string", (void **)&dll_scheme_make_string}, - {"scheme_make_string_output_port", -@@ -500,13 +528,20 @@ static Thunk_Info mzsch_imports[] = { - # if MZSCHEME_VERSION_MAJOR >= 299 - {"scheme_set_param", (void **)&dll_scheme_set_param}, - {"scheme_current_config", (void **)&dll_scheme_current_config}, - {"scheme_char_string_to_byte_string", - (void **)&dll_scheme_char_string_to_byte_string}, -- {"scheme_char_string_to_path", -- (void **)&dll_scheme_char_string_to_path}, -+ {"scheme_char_string_to_path", (void **)&dll_scheme_char_string_to_path}, - # endif -+ {"scheme_make_hash_table", (void **)&dll_scheme_make_hash_table}, -+ {"scheme_hash_set", (void **)&dll_scheme_hash_set}, -+ {"scheme_hash_get", (void **)&dll_scheme_hash_get}, -+ {"scheme_make_double", (void **)&dll_scheme_make_double}, -+# ifdef INCLUDE_MZSCHEME_BASE -+ {"scheme_make_sized_byte_string", (void **)&dll_scheme_make_sized_byte_string}, -+ {"scheme_namespace_require", (void **)&dll_scheme_namespace_require}, -+#endif - {NULL, NULL}}; - - static HINSTANCE hMzGC = 0; - static HINSTANCE hMzSch = 0; - -@@ -590,34 +625,42 @@ dynamic_mzscheme_end(void) - hMzGC = 0; - } - } - #endif /* DYNAMIC_MZSCHEME */ - -+/* need to put it here for dynamic stuff to work */ -+#if defined(INCLUDE_MZSCHEME_BASE) -+# include "mzscheme_base.c" -+#elif MZSCHEME_VERSION_MAJOR >= 400 -+# error MzScheme 4.x must include mzscheme_base.c, for MinGW32 you need to define MZSCHEME_GENERATE_BASE=yes -+#endif -+ - /* - *======================================================================== - * 1. MzScheme interpreter startup - *======================================================================== - */ - - static Scheme_Type mz_buffer_type; - static Scheme_Type mz_window_type; - --static int initialized = 0; -+static int initialized = FALSE; - - /* global environment */ - static Scheme_Env *environment = NULL; - /* output/error handlers */ - static Scheme_Object *curout = NULL; - static Scheme_Object *curerr = NULL; --/* vim:exn exception */ -+/* exn:vim exception */ - static Scheme_Object *exn_catching_apply = NULL; - static Scheme_Object *exn_p = NULL; - static Scheme_Object *exn_message = NULL; - static Scheme_Object *vim_exn = NULL; /* Vim Error exception */ -- /* values for exn:vim - constructor, predicate, accessors etc */ --static Scheme_Object *vim_exn_names = NULL; --static Scheme_Object *vim_exn_values = NULL; -+ -+#if !defined(MZ_PRECISE_GC) || MZSCHEME_VERSION_MAJOR < 400 -+static void *stack_base = NULL; -+#endif - - static long range_start; - static long range_end; - - /* MzScheme threads scheduling stuff */ -@@ -665,15 +708,13 @@ static void remove_timer(void); - /* timers are presented in GUI only */ - # if defined(FEAT_GUI_W32) - static void CALLBACK - timer_proc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime) - # elif defined(FEAT_GUI_GTK) --/*ARGSUSED*/ - static gint - timer_proc(gpointer data) - # elif defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) --/* ARGSUSED */ - static void - timer_proc(XtPointer timed_out, XtIntervalId *interval_id) - # elif defined(FEAT_GUI_MAC) - pascal void - timer_proc(EventLoopTimerRef theTimer, void *userData) -@@ -751,203 +792,333 @@ mzscheme_end(void) - #ifdef DYNAMIC_MZSCHEME - dynamic_mzscheme_end(); - #endif - } - -+ void -+mzscheme_main(void) -+{ -+#if defined(MZ_PRECISE_GC) && MZSCHEME_VERSION_MAJOR >= 400 -+ /* use trampoline for precise GC in MzScheme >= 4.x */ -+ scheme_main_setup(TRUE, mzscheme_env_main, 0, NULL); -+#else -+ mzscheme_env_main(NULL, 0, NULL); -+#endif -+} -+ -+ static int -+mzscheme_env_main(Scheme_Env *env, int argc, char **argv) -+{ -+ /* neither argument nor return values are used */ -+#ifdef MZ_PRECISE_GC -+# if MZSCHEME_VERSION_MAJOR < 400 -+ /* -+ * Starting from version 4.x, embedding applications must use -+ * scheme_main_setup/scheme_main_stack_setup trampolines -+ * rather than setting stack base directly with scheme_set_stack_base -+ */ -+ Scheme_Object *dummy = NULL; -+ MZ_GC_DECL_REG(1); -+ MZ_GC_VAR_IN_REG(0, dummy); -+ -+ stack_base = &__gc_var_stack__; -+# else -+ /* environment has been created by us by Scheme */ -+ environment = env; -+# endif -+ /* -+ * In 4.x, all activities must be performed inside trampoline -+ * so we are forced to initialise GC immediately -+ * This can be postponed in 3.x but I see no point in implementing -+ * a feature which will work in older versions only. -+ * One would better use conservative GC if he needs dynamic MzScheme -+ */ -+ mzscheme_init(); -+#else -+ int dummy = 0; -+ stack_base = (void *)&dummy; -+#endif -+ main_loop(FALSE, FALSE); -+#if defined(MZ_PRECISE_GC) && MZSCHEME_VERSION_MAJOR < 400 -+ /* releasing dummy */ -+ MZ_GC_REG(); -+ MZ_GC_UNREG(); -+#endif -+ return 0; -+} -+ - static void - startup_mzscheme(void) - { -- Scheme_Object *proc_make_security_guard; -- -- scheme_set_stack_base(NULL, 1); -+#if !defined(MZ_PRECISE_GC) || MZSCHEME_VERSION_MAJOR < 400 -+ scheme_set_stack_base(stack_base, 1); -+#endif - - MZ_REGISTER_STATIC(environment); - MZ_REGISTER_STATIC(curout); - MZ_REGISTER_STATIC(curerr); - MZ_REGISTER_STATIC(exn_catching_apply); - MZ_REGISTER_STATIC(exn_p); - MZ_REGISTER_STATIC(exn_message); - MZ_REGISTER_STATIC(vim_exn); -- MZ_REGISTER_STATIC(vim_exn_names); -- MZ_REGISTER_STATIC(vim_exn_values); - -+#if !defined(MZ_PRECISE_GC) || MZSCHEME_VERSION_MAJOR < 400 -+ /* in newer versions of precise GC the initial env has been created */ - environment = scheme_basic_env(); -+#endif -+ MZ_GC_CHECK(); -+ -+#ifdef INCLUDE_MZSCHEME_BASE -+ { -+ /* -+ * versions 4.x do not provide Scheme bindings by default -+ * we need to add them explicitly -+ */ -+ Scheme_Object *scheme_base_symbol = NULL; -+ MZ_GC_DECL_REG(1); -+ MZ_GC_VAR_IN_REG(0, scheme_base_symbol); -+ MZ_GC_REG(); -+ /* invoke function from generated and included mzscheme_base.c */ -+ declare_modules(environment); -+ scheme_base_symbol = scheme_intern_symbol("scheme/base"); -+ MZ_GC_CHECK(); -+ scheme_namespace_require(scheme_base_symbol); -+ MZ_GC_CHECK(); -+ MZ_GC_UNREG(); -+ } -+#endif -+ register_vim_exn(); -+ /* use new environment to initialise exception handling */ -+ init_exn_catching_apply(); - - /* redirect output */ - scheme_console_output = do_output; - scheme_console_printf = do_printf; - - #ifdef MZSCHEME_COLLECTS - /* setup 'current-library-collection-paths' parameter */ -- scheme_set_param(scheme_config, MZCONFIG_COLLECTION_PATHS, -- scheme_make_pair( - # if MZSCHEME_VERSION_MAJOR >= 299 -- scheme_char_string_to_path( -- scheme_byte_string_to_char_string( -- scheme_make_byte_string(MZSCHEME_COLLECTS))), -+ { -+ Scheme_Object *coll_byte_string = NULL; -+ Scheme_Object *coll_char_string = NULL; -+ Scheme_Object *coll_path = NULL; -+ Scheme_Object *coll_pair = NULL; -+ Scheme_Config *config = NULL; -+ -+ MZ_GC_DECL_REG(5); -+ MZ_GC_VAR_IN_REG(0, coll_byte_string); -+ MZ_GC_VAR_IN_REG(1, coll_char_string); -+ MZ_GC_VAR_IN_REG(2, coll_path); -+ MZ_GC_VAR_IN_REG(3, coll_pair); -+ MZ_GC_VAR_IN_REG(4, config); -+ MZ_GC_REG(); -+ coll_byte_string = scheme_make_byte_string(MZSCHEME_COLLECTS); -+ MZ_GC_CHECK(); -+ coll_char_string = scheme_byte_string_to_char_string(coll_byte_string); -+ MZ_GC_CHECK(); -+ coll_path = scheme_char_string_to_path(coll_char_string); -+ MZ_GC_CHECK(); -+ coll_pair = scheme_make_pair(coll_path, scheme_null); -+ MZ_GC_CHECK(); -+ config = scheme_config; -+ MZ_GC_CHECK(); -+ scheme_set_param(config, MZCONFIG_COLLECTION_PATHS, coll_pair); -+ MZ_GC_CHECK(); -+ MZ_GC_UNREG(); -+ } - # else -- scheme_make_string(MZSCHEME_COLLECTS), -+ { -+ Scheme_Object *coll_string = NULL; -+ Scheme_Object *coll_pair = NULL; -+ Scheme_Config *config = NULL; -+ -+ MZ_GC_DECL_REG(3); -+ MZ_GC_VAR_IN_REG(0, coll_string); -+ MZ_GC_VAR_IN_REG(1, coll_pair); -+ MZ_GC_VAR_IN_REG(2, config); -+ MZ_GC_REG(); -+ coll_string = scheme_make_string(MZSCHEME_COLLECTS); -+ MZ_GC_CHECK(); -+ coll_pair = scheme_make_pair(coll_string, scheme_null); -+ MZ_GC_CHECK(); -+ config = scheme_config; -+ MZ_GC_CHECK(); -+ scheme_set_param(config, MZCONFIG_COLLECTION_PATHS, coll_pair); -+ MZ_GC_CHECK(); -+ MZ_GC_UNREG(); -+ } - # endif -- scheme_null)); - #endif - #ifdef HAVE_SANDBOX -- /* setup sandbox guards */ -- proc_make_security_guard = scheme_lookup_global( -- scheme_intern_symbol("make-security-guard"), -- environment); -- if (proc_make_security_guard != NULL) -- { -- Scheme_Object *args[3]; -- Scheme_Object *guard; -- args[0] = scheme_get_param(scheme_config, MZCONFIG_SECURITY_GUARD); -- args[1] = scheme_make_prim_w_arity(sandbox_file_guard, -- "sandbox-file-guard", 3, 3); -- args[2] = scheme_make_prim_w_arity(sandbox_network_guard, -- "sandbox-network-guard", 4, 4); -- guard = scheme_apply(proc_make_security_guard, 3, args); -- scheme_set_param(scheme_config, MZCONFIG_SECURITY_GUARD, guard); -+ { -+ Scheme_Object *make_security_guard = NULL; -+ MZ_GC_DECL_REG(1); -+ MZ_GC_VAR_IN_REG(0, make_security_guard); -+ MZ_GC_REG(); -+ -+#if MZSCHEME_VERSION_MAJOR < 400 -+ { -+ Scheme_Object *make_security_guard_symbol = NULL; -+ MZ_GC_DECL_REG(1); -+ MZ_GC_VAR_IN_REG(0, make_security_guard_symbol); -+ MZ_GC_REG(); -+ make_security_guard_symbol = scheme_intern_symbol("make-security-guard"); -+ MZ_GC_CHECK(); -+ make_security_guard = scheme_lookup_global( -+ make_security_guard_symbol, environment); -+ MZ_GC_UNREG(); -+ } -+#else -+ make_security_guard = scheme_builtin_value("make-security-guard"); -+ MZ_GC_CHECK(); -+#endif -+ -+ /* setup sandbox guards */ -+ if (make_security_guard != NULL) -+ { -+ Scheme_Object *args[3] = {NULL, NULL, NULL}; -+ Scheme_Object *guard = NULL; -+ Scheme_Config *config = NULL; -+ MZ_GC_DECL_REG(5); -+ MZ_GC_ARRAY_VAR_IN_REG(0, args, 3); -+ MZ_GC_VAR_IN_REG(3, guard); -+ MZ_GC_VAR_IN_REG(4, config); -+ MZ_GC_REG(); -+ config = scheme_config; -+ MZ_GC_CHECK(); -+ args[0] = scheme_get_param(config, MZCONFIG_SECURITY_GUARD); -+ MZ_GC_CHECK(); -+ args[1] = scheme_make_prim_w_arity(sandbox_file_guard, -+ "sandbox-file-guard", 3, 3); -+ args[2] = scheme_make_prim_w_arity(sandbox_network_guard, -+ "sandbox-network-guard", 4, 4); -+ guard = scheme_apply(make_security_guard, 3, args); -+ MZ_GC_CHECK(); -+ scheme_set_param(config, MZCONFIG_SECURITY_GUARD, guard); -+ MZ_GC_CHECK(); -+ MZ_GC_UNREG(); -+ } -+ MZ_GC_UNREG(); - } - #endif - /* Create buffer and window types for use in Scheme code */ - mz_buffer_type = scheme_make_type("<vim-buffer>"); -+ MZ_GC_CHECK(); - mz_window_type = scheme_make_type("<vim-window>"); -+ MZ_GC_CHECK(); -+#ifdef MZ_PRECISE_GC -+ GC_register_traversers(mz_buffer_type, -+ buffer_size_proc, buffer_mark_proc, buffer_fixup_proc, -+ TRUE, TRUE); -+ GC_register_traversers(mz_window_type, -+ window_size_proc, window_mark_proc, window_fixup_proc, -+ TRUE, TRUE); -+#endif - -- register_vim_exn(environment); -- make_modules(environment); -+ make_modules(); - - /* - * setup callback to receive notifications - * whether thread scheduling is (or not) required - */ - scheme_notify_multithread = notify_multithread; -- initialized = 1; - } - - /* - * This routine is called for each new invocation of MzScheme - * to make sure things are properly initialized. - */ - static int - mzscheme_init(void) - { -- int do_require = FALSE; -- - if (!initialized) - { -- do_require = TRUE; - #ifdef DYNAMIC_MZSCHEME - if (!mzscheme_enabled(TRUE)) - { -- EMSG(_("???: Sorry, this command is disabled, the MzScheme library could not be loaded.")); -+ EMSG(_("E815: Sorry, this command is disabled, the MzScheme libraries could not be loaded.")); - return -1; - } - #endif - startup_mzscheme(); -- -- if (mzscheme_io_init()) -- return -1; -- -- } -- /* recreate ports each call effectivelly clearing these ones */ -- curout = scheme_make_string_output_port(); -- curerr = scheme_make_string_output_port(); -- scheme_set_param(scheme_config, MZCONFIG_OUTPUT_PORT, curout); -- scheme_set_param(scheme_config, MZCONFIG_ERROR_PORT, curerr); -- -- if (do_require) -- { -- /* auto-instantiate in basic env */ -- eval_in_namespace("(require (prefix vimext: vimext))", do_eval, -- environment, NULL); -+ initialized = TRUE; - } -- -- return 0; --} -- --/* -- * This routine fills the namespace with various important routines that can -- * be used within MzScheme. -- */ -- static void --mzscheme_interface_init(vim_mz_buffer *mzbuff) --{ -- Scheme_Object *attach; -- -- mzbuff->env = (Scheme_Env *)scheme_make_namespace(0, NULL); -- -- /* -- * attach instantiated modules from global namespace -- * so they can be easily instantiated in the buffer namespace -- */ -- attach = scheme_lookup_global( -- scheme_intern_symbol("namespace-attach-module"), -- environment); -- -- if (attach != NULL) - { -- Scheme_Object *ret; -- Scheme_Object *args[2]; -- -- args[0] = (Scheme_Object *)environment; -- args[1] = scheme_intern_symbol("vimext"); -- -- ret = (Scheme_Object *)mzvim_apply(attach, 2, args); -+ Scheme_Config *config = NULL; -+ MZ_GC_DECL_REG(1); -+ MZ_GC_VAR_IN_REG(0, config); -+ MZ_GC_REG(); -+ config = scheme_config; -+ MZ_GC_CHECK(); -+ /* recreate ports each call effectively clearing these ones */ -+ curout = scheme_make_string_output_port(); -+ MZ_GC_CHECK(); -+ curerr = scheme_make_string_output_port(); -+ MZ_GC_CHECK(); -+ scheme_set_param(config, MZCONFIG_OUTPUT_PORT, curout); -+ MZ_GC_CHECK(); -+ scheme_set_param(config, MZCONFIG_ERROR_PORT, curerr); -+ MZ_GC_CHECK(); -+ MZ_GC_UNREG(); - } - -- add_vim_exn(mzbuff->env); -+ return 0; - } - - /* - *======================================================================== - * 2. External Interface - *======================================================================== - */ - - /* -- * Evaluate command in namespace with exception handling -+ * Evaluate command with exception handling - */ - static int --eval_in_namespace(void *data, Scheme_Closed_Prim *what, Scheme_Env *env, -- Scheme_Object **ret) -+eval_with_exn_handling(void *data, Scheme_Closed_Prim *what, Scheme_Object **ret) - { -- Scheme_Object *value; -- Scheme_Object *exn; -- Cmd_Info info; /* closure info */ -- -- info.data = data; -- info.env = env; -- -- scheme_set_param(scheme_config, MZCONFIG_ENV, -- (Scheme_Object *) env); -- /* -- * ensure all evaluations will be in current buffer namespace, -- * the second argument to scheme_eval_string isn't enough! -- */ -- value = _apply_thunk_catch_exceptions( -- scheme_make_closed_prim_w_arity(what, &info, "mzvim", 0, 0), -- &exn); -+ Scheme_Object *value = NULL; -+ Scheme_Object *exn = NULL; -+ Scheme_Object *prim = NULL; -+ -+ MZ_GC_DECL_REG(3); -+ MZ_GC_VAR_IN_REG(0, value); -+ MZ_GC_VAR_IN_REG(1, exn); -+ MZ_GC_VAR_IN_REG(2, prim); -+ MZ_GC_REG(); -+ -+ prim = scheme_make_closed_prim_w_arity(what, data, "mzvim", 0, 0); -+ MZ_GC_CHECK(); -+ value = _apply_thunk_catch_exceptions(prim, &exn); -+ MZ_GC_CHECK(); - - if (!value) - { - value = extract_exn_message(exn); - /* Got an exn? */ - if (value) - { -- scheme_display(value, curerr); /* Send to stderr-vim */ -+ scheme_display(value, curerr); /* Send to stderr-vim */ -+ MZ_GC_CHECK(); - do_flush(); - } -+ MZ_GC_UNREG(); - /* `raise' was called on some arbitrary value */ - return FAIL; - } - - if (ret != NULL) /* if pointer to retval supported give it up */ - *ret = value; - /* Print any result, as long as it's not a void */ - else if (!SCHEME_VOIDP(value)) -+ { - scheme_display(value, curout); /* Send to stdout-vim */ -+ MZ_GC_CHECK(); -+ } - - do_flush(); -+ MZ_GC_UNREG(); - return OK; - } - - /* :mzscheme */ - static int -@@ -957,11 +1128,11 @@ do_mzscheme_command(exarg_T *eap, void * - return FAIL; - - range_start = eap->line1; - range_end = eap->line2; - -- return eval_in_namespace(data, what, get_vim_curr_buffer()->env, NULL); -+ return eval_with_exn_handling(data, what, NULL); - } - - /* - * Routine called by VIM when deleting a buffer - */ -@@ -974,10 +1145,11 @@ mzscheme_buffer_free(buf_T *buf) - - bp = buf->b_mzscheme_ref; - bp->buf = INVALID_BUFFER_VALUE; - buf->b_mzscheme_ref = NULL; - scheme_gc_ptr_ok(bp); -+ MZ_GC_CHECK(); - } - } - - /* - * Routine called by VIM when deleting a Window -@@ -990,10 +1162,11 @@ mzscheme_window_free(win_T *win) - vim_mz_window *wp; - wp = win->w_mzscheme_ref; - wp->win = INVALID_WINDOW_VALUE; - win->w_mzscheme_ref = NULL; - scheme_gc_ptr_ok(wp); -+ MZ_GC_CHECK(); - } - } - - /* - * ":mzscheme" (or ":mz") -@@ -1014,80 +1187,67 @@ ex_mzscheme(exarg_T *eap) - vim_free(script); - } - } - } - --/* eval MzScheme string */ -- void * --mzvim_eval_string(char_u *str) --{ -- Scheme_Object *ret = NULL; -- if (mzscheme_init()) -- return FAIL; -- -- eval_in_namespace(str, do_eval, get_vim_curr_buffer()->env, &ret); -- return ret; --} -- --/* -- * apply MzScheme procedure with arguments, -- * handling errors -- */ -- Scheme_Object * --mzvim_apply(Scheme_Object *proc, int argc, Scheme_Object **argv) --{ -- Apply_Info data; -- Scheme_Object *ret = NULL; -- -- if (mzscheme_init()) -- return FAIL; -- -- data.proc = proc; -- data.argc = argc; -- data.argv = argv; -- -- eval_in_namespace(&data, do_apply, get_vim_curr_buffer()->env, &ret); -- return ret; --} -- - static Scheme_Object * - do_load(void *data, int noargc, Scheme_Object **noargv) - { -- Cmd_Info *info = (Cmd_Info *)data; -- Scheme_Object *result = scheme_void; -- Scheme_Object *expr; -- char_u *file = scheme_malloc_fail_ok( -- scheme_malloc_atomic, MAXPATHL + 1); -- Port_Info *pinfo = (Port_Info *)(info->data); -+ Scheme_Object *expr = NULL; -+ Scheme_Object *result = NULL; -+ char *file = NULL; -+ Port_Info *pinfo = (Port_Info *)data; -+ -+ MZ_GC_DECL_REG(3); -+ MZ_GC_VAR_IN_REG(0, expr); -+ MZ_GC_VAR_IN_REG(1, result); -+ MZ_GC_VAR_IN_REG(2, file); -+ MZ_GC_REG(); -+ -+ file = (char *)scheme_malloc_fail_ok(scheme_malloc_atomic, MAXPATHL + 1); -+ MZ_GC_CHECK(); - - /* make Vim expansion */ -- expand_env((char_u *)pinfo->name, file, MAXPATHL); -- /* scheme_load looks strange working with namespaces and error handling*/ -+ expand_env((char_u *)pinfo->name, (char_u *)file, MAXPATHL); - pinfo->port = scheme_open_input_file(file, "mzfile"); -- scheme_count_lines(pinfo->port); /* to get accurate read error location*/ -+ MZ_GC_CHECK(); -+ scheme_count_lines(pinfo->port); /* to get accurate read error location*/ -+ MZ_GC_CHECK(); - - /* Like REPL but print only last result */ - while (!SCHEME_EOFP(expr = scheme_read(pinfo->port))) -- result = scheme_eval(expr, info->env); -+ { -+ result = scheme_eval(expr, environment); -+ MZ_GC_CHECK(); -+ } - -- /* errors will be caught in do_mzscheme_comamnd and ex_mzfile */ -+ /* errors will be caught in do_mzscheme_command and ex_mzfile */ - scheme_close_input_port(pinfo->port); -+ MZ_GC_CHECK(); - pinfo->port = NULL; -+ MZ_GC_UNREG(); - return result; - } - - /* :mzfile */ - void - ex_mzfile(exarg_T *eap) - { -- Port_Info pinfo; -+ Port_Info pinfo = {NULL, NULL}; -+ -+ MZ_GC_DECL_REG(1); -+ MZ_GC_VAR_IN_REG(0, pinfo.port); -+ MZ_GC_REG(); - - pinfo.name = (char *)eap->arg; -- pinfo.port = NULL; - if (do_mzscheme_command(eap, &pinfo, do_load) != OK - && pinfo.port != NULL) /* looks like port was not closed */ -+ { - scheme_close_input_port(pinfo.port); -+ MZ_GC_CHECK(); -+ } -+ MZ_GC_UNREG(); - } - - - /* - *======================================================================== -@@ -1103,18 +1263,16 @@ init_exn_catching_apply(void) - char *e = - "(lambda (thunk) " - "(with-handlers ([void (lambda (exn) (cons #f exn))]) " - "(cons #t (thunk))))"; - -- /* make sure we have a namespace with the standard syntax: */ -- Scheme_Env *env = (Scheme_Env *)scheme_make_namespace(0, NULL); -- add_vim_exn(env); -- -- exn_catching_apply = scheme_eval_string(e, env); -- exn_p = scheme_lookup_global(scheme_intern_symbol("exn?"), env); -- exn_message = scheme_lookup_global( -- scheme_intern_symbol("exn-message"), env); -+ exn_catching_apply = scheme_eval_string(e, environment); -+ MZ_GC_CHECK(); -+ exn_p = scheme_builtin_value("exn?"); -+ MZ_GC_CHECK(); -+ exn_message = scheme_builtin_value("exn-message"); -+ MZ_GC_CHECK(); - } - } - - /* - * This function applies a thunk, returning the Scheme value if there's -@@ -1124,12 +1282,10 @@ init_exn_catching_apply(void) - static Scheme_Object * - _apply_thunk_catch_exceptions(Scheme_Object *f, Scheme_Object **exn) - { - Scheme_Object *v; - -- init_exn_catching_apply(); -- - v = _scheme_apply(exn_catching_apply, 1, &f); - /* v is a pair: (cons #t value) or (cons #f exn) */ - - if (SCHEME_TRUEP(SCHEME_CAR(v))) - return SCHEME_CDR(v); -@@ -1141,32 +1297,20 @@ _apply_thunk_catch_exceptions(Scheme_Obj - } - - static Scheme_Object * - extract_exn_message(Scheme_Object *v) - { -- init_exn_catching_apply(); -- - if (SCHEME_TRUEP(_scheme_apply(exn_p, 1, &v))) - return _scheme_apply(exn_message, 1, &v); - else - return NULL; /* Not an exn structure */ - } - - static Scheme_Object * - do_eval(void *s, int noargc, Scheme_Object **noargv) - { -- Cmd_Info *info = (Cmd_Info *)s; -- -- return scheme_eval_string_all((char *)(info->data), info->env, TRUE); --} -- -- static Scheme_Object * --do_apply(void *a, int noargc, Scheme_Object **noargv) --{ -- Apply_Info *info = (Apply_Info *)(((Cmd_Info *)a)->data); -- -- return scheme_apply(info->proc, info->argc, info->argv); -+ return scheme_eval_string_all((char *)s, environment, TRUE); - } - - /* - *======================================================================== - * 3. MzScheme I/O Handlers -@@ -1219,28 +1363,23 @@ do_flush(void) - { - char *buff; - long length; - - buff = scheme_get_sized_string_output(curerr, &length); -+ MZ_GC_CHECK(); - if (length) - { - do_err_output(buff, length); - return; - } - - buff = scheme_get_sized_string_output(curout, &length); -+ MZ_GC_CHECK(); - if (length) - do_output(buff, length); - } - -- static int --mzscheme_io_init(void) --{ -- /* Nothing needed so far... */ -- return 0; --} -- - /* - *======================================================================== - * 4. Implementation of the Vim Features for MzScheme - *======================================================================== - */ -@@ -1263,26 +1402,34 @@ vim_command(void *data, int argc, Scheme - /* (eval {expr-string}) */ - static Scheme_Object * - vim_eval(void *data, int argc, Scheme_Object **argv) - { - #ifdef FEAT_EVAL -- Vim_Prim *prim = (Vim_Prim *)data; -- char *expr; -- char *str; -- Scheme_Object *result; -+ Vim_Prim *prim = (Vim_Prim *)data; -+ char *expr; -+ Scheme_Object *result; -+ /* hash table to store visited values to avoid infinite loops */ -+ Scheme_Hash_Table *visited = NULL; -+ typval_T *vim_result; -+ -+ MZ_GC_DECL_REG(1); -+ MZ_GC_VAR_IN_REG(0, visited); -+ MZ_GC_REG(); - -- expr = SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0)); -+ visited = scheme_make_hash_table(SCHEME_hash_ptr); -+ MZ_GC_CHECK(); - -- str = (char *)eval_to_string((char_u *)expr, NULL, TRUE); -+ expr = SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0)); -+ vim_result = eval_expr((char_u *)expr, NULL); - -- if (str == NULL) -+ if (vim_result == NULL) - raise_vim_exn(_("invalid expression")); - -- result = scheme_make_string(str); -- -- vim_free(str); -+ result = vim_to_mzscheme(vim_result, 1, visited); -+ free_tv(vim_result); - -+ MZ_GC_UNREG(); - return result; - #else - raise_vim_exn(_("expressions disabled at compile time")); - /* unreachable */ - return scheme_false; -@@ -1318,11 +1465,11 @@ static Scheme_Object *M_global = NULL; - get_option(void *data, int argc, Scheme_Object **argv) - { - Vim_Prim *prim = (Vim_Prim *)data; - char_u *name; - long value; -- char_u *strval; -+ char *strval; - int rc; - Scheme_Object *rval; - int opt_flags = 0; - buf_T *save_curb = curbuf; - win_T *save_curw = curwin; -@@ -1333,10 +1480,11 @@ get_option(void *data, int argc, Scheme_ - { - if (M_global == NULL) - { - MZ_REGISTER_STATIC(M_global); - M_global = scheme_intern_symbol("global"); -+ MZ_GC_CHECK(); - } - - if (argv[1] == M_global) - opt_flags = OPT_GLOBAL; - else if (SCHEME_VIMBUFFERP(argv[1])) -@@ -1354,20 +1502,21 @@ get_option(void *data, int argc, Scheme_ - } - else - scheme_wrong_type(prim->name, "vim-buffer/window", 1, argc, argv); - } - -- rc = get_option_value(name, &value, &strval, opt_flags); -+ rc = get_option_value(name, &value, (char_u **)&strval, opt_flags); - curbuf = save_curb; - curwin = save_curw; - - switch (rc) - { - case 1: - return scheme_make_integer_value(value); - case 0: - rval = scheme_make_string(strval); -+ MZ_GC_CHECK(); - vim_free(strval); - return rval; - case -1: - case -2: - raise_vim_exn(_("hidden option")); -@@ -1393,10 +1542,11 @@ set_option(void *data, int argc, Scheme_ - { - if (M_global == NULL) - { - MZ_REGISTER_STATIC(M_global); - M_global = scheme_intern_symbol("global"); -+ MZ_GC_CHECK(); - } - - if (argv[1] == M_global) - opt_flags = OPT_GLOBAL; - else if (SCHEME_VIMBUFFERP(argv[1])) -@@ -1463,19 +1613,26 @@ get_window_list(void *data, int argc, Sc - buf = get_buffer_arg(prim->name, 0, argc, argv); - list = scheme_null; - - for (w = firstwin; w != NULL; w = w->w_next) - if (w->w_buffer == buf->buf) -+ { - list = scheme_make_pair(window_new(w), list); -+ MZ_GC_CHECK(); -+ } - - return list; - } - - static Scheme_Object * - window_new(win_T *win) - { -- vim_mz_window *self; -+ vim_mz_window *self = NULL; -+ -+ MZ_GC_DECL_REG(1); -+ MZ_GC_VAR_IN_REG(0, self); -+ MZ_GC_REG(); - - /* We need to handle deletion of windows underneath us. - * If we add a "w_mzscheme_ref" field to the win_T structure, - * then we can get at it in win_free() in vim. - * -@@ -1485,17 +1642,18 @@ window_new(win_T *win) - */ - if (win->w_mzscheme_ref != NULL) - return win->w_mzscheme_ref; - - self = scheme_malloc_fail_ok(scheme_malloc, sizeof(vim_mz_window)); -- - vim_memset(self, 0, sizeof(vim_mz_window)); - scheme_dont_gc_ptr(self); /* because win isn't visible to GC */ -+ MZ_GC_CHECK(); - win->w_mzscheme_ref = self; - self->win = win; -- self->tag = mz_window_type; -+ self->so.type = mz_window_type; - -+ MZ_GC_UNREG(); - return (Scheme_Object *)(self); - } - - /* (get-win-num [window]) */ - static Scheme_Object * -@@ -1660,27 +1818,26 @@ set_cursor(void *data, int argc, Scheme_ - return scheme_void; - } - /* - *=========================================================================== - * 6. Vim Buffer-related Manipulation Functions -- * Note that each buffer should have its own private namespace. - *=========================================================================== - */ - - /* (open-buff {filename}) */ - static Scheme_Object * - mzscheme_open_buffer(void *data, int argc, Scheme_Object **argv) - { - Vim_Prim *prim = (Vim_Prim *)data; -- char *fname; -+ char_u *fname; - int num = 0; - Scheme_Object *onum; - - #ifdef HAVE_SANDBOX - sandbox_check(); - #endif -- fname = SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0)); -+ fname = (char_u *)SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0)); - /* TODO make open existing file */ - num = buflist_add(fname, BLN_LISTED | BLN_CURBUF); - - if (num == 0) - raise_vim_exn(_("couldn't open buffer")); -@@ -1712,11 +1869,11 @@ get_buffer_by_name(void *data, int argc, - { - Vim_Prim *prim = (Vim_Prim *)data; - buf_T *buf; - char_u *fname; - -- fname = SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0)); -+ fname = (char_u *)SCHEME_STR_VAL(GUARANTEE_STRING(prim->name, 0)); - - for (buf = firstbuf; buf; buf = buf->b_next) - if (buf->b_ffname == NULL || buf->b_sfname == NULL) - /* empty string */ - { -@@ -1783,11 +1940,11 @@ get_buffer_count(void *data, int argc, S - get_buffer_name(void *data, int argc, Scheme_Object **argv) - { - Vim_Prim *prim = (Vim_Prim *)data; - vim_mz_buffer *buf = get_buffer_arg(prim->name, 0, argc, argv); - -- return scheme_make_string(buf->buf->b_ffname); -+ return scheme_make_string((char *)buf->buf->b_ffname); - } - - /* (curr-buff) */ - static Scheme_Object * - get_curr_buffer(void *data, int argc, Scheme_Object **argv) -@@ -1796,29 +1953,32 @@ get_curr_buffer(void *data, int argc, Sc - } - - static Scheme_Object * - buffer_new(buf_T *buf) - { -- vim_mz_buffer *self; -+ vim_mz_buffer *self = NULL; -+ -+ MZ_GC_DECL_REG(1); -+ MZ_GC_VAR_IN_REG(0, self); -+ MZ_GC_REG(); - - /* We need to handle deletion of buffers underneath us. - * If we add a "b_mzscheme_ref" field to the buf_T structure, - * then we can get at it in buf_freeall() in vim. - */ - if (buf->b_mzscheme_ref) - return buf->b_mzscheme_ref; - - self = scheme_malloc_fail_ok(scheme_malloc, sizeof(vim_mz_buffer)); -- - vim_memset(self, 0, sizeof(vim_mz_buffer)); -- scheme_dont_gc_ptr(self); /* because buf isn't visible to GC */ -+ scheme_dont_gc_ptr(self); /* because buf isn't visible to GC */ -+ MZ_GC_CHECK(); - buf->b_mzscheme_ref = self; - self->buf = buf; -- self->tag = mz_buffer_type; -- -- mzscheme_interface_init(self); /* Set up namespace */ -+ self->so.type = mz_buffer_type; - -+ MZ_GC_UNREG(); - return (Scheme_Object *)(self); - } - - /* - * (get-buff-size [buffer]) -@@ -1845,18 +2005,18 @@ get_buffer_size(void *data, int argc, Sc - get_buffer_line(void *data, int argc, Scheme_Object **argv) - { - Vim_Prim *prim = (Vim_Prim *)data; - vim_mz_buffer *buf; - int linenr; -- char *line; -+ char_u *line; - - buf = get_buffer_arg(prim->name, 1, argc, argv); - linenr = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 0)); - line = ml_get_buf(buf->buf, (linenr_T)linenr, FALSE); - - raise_if_error(); -- return scheme_make_string(line); -+ return scheme_make_string((char *)line); - } - - - /* - * (get-buff-line-list {start} {end} [buffer]) -@@ -1869,11 +2029,15 @@ get_buffer_line(void *data, int argc, Sc - get_buffer_line_list(void *data, int argc, Scheme_Object **argv) - { - Vim_Prim *prim = (Vim_Prim *)data; - vim_mz_buffer *buf; - int i, hi, lo, n; -- Scheme_Object *list; -+ Scheme_Object *list = NULL; -+ -+ MZ_GC_DECL_REG(1); -+ MZ_GC_VAR_IN_REG(0, list); -+ MZ_GC_REG(); - - buf = get_buffer_arg(prim->name, 2, argc, argv); - list = scheme_null; - hi = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 1)); - lo = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 0)); -@@ -1897,12 +2061,13 @@ get_buffer_line_list(void *data, int arg - (char *)ml_get_buf(buf->buf, (linenr_T)(lo+i), FALSE)); - raise_if_error(); - - /* Set the list item */ - list = scheme_make_pair(str, list); -+ MZ_GC_CHECK(); - } -- -+ MZ_GC_UNREG(); - return list; - } - - /* - * (set-buff-line {linenr} {string/#f} [buffer]) -@@ -1917,23 +2082,26 @@ get_buffer_line_list(void *data, int arg - * string changed. - */ - static Scheme_Object * - set_buffer_line(void *data, int argc, Scheme_Object **argv) - { -- /* First of all, we check the the of the supplied MzScheme object. -+ /* First of all, we check the value of the supplied MzScheme object. - * There are three cases: - * 1. #f - this is a deletion. - * 2. A string - this is a replacement. - * 3. Anything else - this is an error. - */ - Vim_Prim *prim = (Vim_Prim *)data; - vim_mz_buffer *buf; -- Scheme_Object *line; -+ Scheme_Object *line = NULL; - char *save; -- buf_T *savebuf; - int n; - -+ MZ_GC_DECL_REG(1); -+ MZ_GC_VAR_IN_REG(0, line); -+ MZ_GC_REG(); -+ - #ifdef HAVE_SANDBOX - sandbox_check(); - #endif - n = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 0)); - if (!SCHEME_STRINGP(argv[1]) && !SCHEME_FALSEP(argv[1])) -@@ -1943,11 +2111,12 @@ set_buffer_line(void *data, int argc, Sc - - check_line_range(n, buf->buf); - - if (SCHEME_FALSEP(line)) - { -- savebuf = curbuf; -+ buf_T *savebuf = curbuf; -+ - curbuf = buf->buf; - - if (u_savedel((linenr_T)n, 1L) == FAIL) - { - curbuf = savebuf; -@@ -1956,43 +2125,66 @@ set_buffer_line(void *data, int argc, Sc - else if (ml_delete((linenr_T)n, FALSE) == FAIL) - { - curbuf = savebuf; - raise_vim_exn(_("cannot delete line")); - } -- deleted_lines_mark((linenr_T)n, 1L); - if (buf->buf == curwin->w_buffer) - mz_fix_cursor(n, n + 1, -1); -+ deleted_lines_mark((linenr_T)n, 1L); - - curbuf = savebuf; - -+ MZ_GC_UNREG(); - raise_if_error(); - return scheme_void; - } -+ else -+ { -+ /* Otherwise it's a line */ -+ buf_T *savebuf = curbuf; - -- /* Otherwise it's a line */ -- save = string_to_line(line); -- savebuf = curbuf; -+ save = string_to_line(line); - -- curbuf = buf->buf; -+ curbuf = buf->buf; -+ -+ if (u_savesub((linenr_T)n) == FAIL) -+ { -+ curbuf = savebuf; -+ vim_free(save); -+ raise_vim_exn(_("cannot save undo information")); -+ } -+ else if (ml_replace((linenr_T)n, (char_u *)save, TRUE) == FAIL) -+ { -+ curbuf = savebuf; -+ vim_free(save); -+ raise_vim_exn(_("cannot replace line")); -+ } -+ else -+ { -+ vim_free(save); -+ changed_bytes((linenr_T)n, 0); -+ } - -- if (u_savesub((linenr_T)n) == FAIL) -- { -- curbuf = savebuf; -- raise_vim_exn(_("cannot save undo information")); -- } -- else if (ml_replace((linenr_T)n, (char_u *)save, TRUE) == FAIL) -- { - curbuf = savebuf; -- raise_vim_exn(_("cannot replace line")); -- } -- else -- changed_bytes((linenr_T)n, 0); - -- curbuf = savebuf; -+ /* Check that the cursor is not beyond the end of the line now. */ -+ if (buf->buf == curwin->w_buffer) -+ check_cursor_col(); - -- raise_if_error(); -- return scheme_void; -+ MZ_GC_UNREG(); -+ raise_if_error(); -+ return scheme_void; -+ } -+} -+ -+ static void -+free_array(char **array) -+{ -+ char **curr = array; -+ while (*curr != NULL) -+ vim_free(*curr++); -+ vim_free(array); - } - - /* - * (set-buff-line-list {start} {end} {string-list/#f/null} [buffer]) - * -@@ -2013,19 +2205,19 @@ set_buffer_line_list(void *data, int arg - * 1. #f - this is a deletion. - * 2. A list - this is a replacement. - * 3. Anything else - this is an error. - */ - Vim_Prim *prim = (Vim_Prim *)data; -- vim_mz_buffer *buf; -- Scheme_Object *line_list; -- Scheme_Object *line; -- Scheme_Object *rest; -- char **array; -- buf_T *savebuf; -+ vim_mz_buffer *buf = NULL; -+ Scheme_Object *line_list = NULL; - int i, old_len, new_len, hi, lo; - long extra; - -+ MZ_GC_DECL_REG(1); -+ MZ_GC_VAR_IN_REG(0, line_list); -+ MZ_GC_REG(); -+ - #ifdef HAVE_SANDBOX - sandbox_check(); - #endif - lo = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 0)); - hi = SCHEME_INT_VAL(GUARANTEE_INTEGER(prim->name, 1)); -@@ -2047,11 +2239,11 @@ set_buffer_line_list(void *data, int arg - check_line_range(lo, buf->buf); /* inclusive */ - check_line_range(hi - 1, buf->buf); /* exclusive */ - - if (SCHEME_FALSEP(line_list) || SCHEME_NULLP(line_list)) - { -- savebuf = curbuf; -+ buf_T *savebuf = curbuf; - curbuf = buf->buf; - - if (u_savedel((linenr_T)lo, (long)old_len) == FAIL) - { - curbuf = savebuf; -@@ -2063,115 +2255,138 @@ set_buffer_line_list(void *data, int arg - if (ml_delete((linenr_T)lo, FALSE) == FAIL) - { - curbuf = savebuf; - raise_vim_exn(_("cannot delete line")); - } -- deleted_lines_mark((linenr_T)lo, (long)old_len); - if (buf->buf == curwin->w_buffer) - mz_fix_cursor(lo, hi, -old_len); -+ deleted_lines_mark((linenr_T)lo, (long)old_len); - } - - curbuf = savebuf; - -+ MZ_GC_UNREG(); - raise_if_error(); - return scheme_void; - } -+ else -+ { -+ buf_T *savebuf = curbuf; - -- /* List */ -- new_len = scheme_proper_list_length(line_list); -- if (new_len < 0) /* improper or cyclic list */ -- scheme_wrong_type(prim->name, "proper list", -- 2, argc, argv); -+ /* List */ -+ new_len = scheme_proper_list_length(line_list); -+ MZ_GC_CHECK(); -+ if (new_len < 0) /* improper or cyclic list */ -+ scheme_wrong_type(prim->name, "proper list", -+ 2, argc, argv); -+ else -+ { -+ char **array = NULL; -+ Scheme_Object *line = NULL; -+ Scheme_Object *rest = NULL; -+ -+ MZ_GC_DECL_REG(2); -+ MZ_GC_VAR_IN_REG(0, line); -+ MZ_GC_VAR_IN_REG(1, rest); -+ MZ_GC_REG(); - -- /* Using MzScheme allocator, so we don't need to free this and -- * can safely keep pointers to GC collected strings -- */ -- array = (char **)scheme_malloc_fail_ok(scheme_malloc, -- (unsigned)(new_len * sizeof(char *))); -+ array = (char **)alloc(new_len * sizeof(char *)); -+ vim_memset(array, 0, new_len * sizeof(char *)); - -- rest = line_list; -- for (i = 0; i < new_len; ++i) -- { -- line = SCHEME_CAR(rest); -- rest = SCHEME_CDR(rest); -- if (!SCHEME_STRINGP(line)) -- scheme_wrong_type(prim->name, "string-list", 2, argc, argv); -- array[i] = string_to_line(line); -- } -+ rest = line_list; -+ for (i = 0; i < new_len; ++i) -+ { -+ line = SCHEME_CAR(rest); -+ rest = SCHEME_CDR(rest); -+ if (!SCHEME_STRINGP(line)) -+ { -+ free_array(array); -+ scheme_wrong_type(prim->name, "string-list", 2, argc, argv); -+ } -+ array[i] = string_to_line(line); -+ } - -- savebuf = curbuf; -- curbuf = buf->buf; -+ curbuf = buf->buf; - -- if (u_save((linenr_T)(lo-1), (linenr_T)hi) == FAIL) -- { -- curbuf = savebuf; -- raise_vim_exn(_("cannot save undo information")); -- } -+ if (u_save((linenr_T)(lo-1), (linenr_T)hi) == FAIL) -+ { -+ curbuf = savebuf; -+ free_array(array); -+ raise_vim_exn(_("cannot save undo information")); -+ } - -- /* -- * If the size of the range is reducing (ie, new_len < old_len) we -- * need to delete some old_len. We do this at the start, by -- * repeatedly deleting line "lo". -- */ -- for (i = 0; i < old_len - new_len; ++i) -- { -- if (ml_delete((linenr_T)lo, FALSE) == FAIL) -- { -- curbuf = savebuf; -- raise_vim_exn(_("cannot delete line")); -- } -- extra--; -- } -+ /* -+ * If the size of the range is reducing (ie, new_len < old_len) we -+ * need to delete some old_len. We do this at the start, by -+ * repeatedly deleting line "lo". -+ */ -+ for (i = 0; i < old_len - new_len; ++i) -+ { -+ if (ml_delete((linenr_T)lo, FALSE) == FAIL) -+ { -+ curbuf = savebuf; -+ free_array(array); -+ raise_vim_exn(_("cannot delete line")); -+ } -+ extra--; -+ } - -- /* -- * For as long as possible, replace the existing old_len with the -- * new old_len. This is a more efficient operation, as it requires -- * less memory allocation and freeing. -- */ -- for (i = 0; i < old_len && i < new_len; i++) -- if (ml_replace((linenr_T)(lo+i), (char_u *)array[i], TRUE) == FAIL) -- { -- curbuf = savebuf; -- raise_vim_exn(_("cannot replace line")); -- } -+ /* -+ * For as long as possible, replace the existing old_len with the -+ * new old_len. This is a more efficient operation, as it requires -+ * less memory allocation and freeing. -+ */ -+ for (i = 0; i < old_len && i < new_len; i++) -+ if (ml_replace((linenr_T)(lo+i), (char_u *)array[i], TRUE) == FAIL) -+ { -+ curbuf = savebuf; -+ free_array(array); -+ raise_vim_exn(_("cannot replace line")); -+ } - -- /* -- * Now we may need to insert the remaining new_len. We don't need to -- * free the string passed back because MzScheme has control of that -- * memory. -- */ -- while (i < new_len) -- { -- if (ml_append((linenr_T)(lo + i - 1), -- (char_u *)array[i], 0, FALSE) == FAIL) -- { -- curbuf = savebuf; -- raise_vim_exn(_("cannot insert line")); -+ /* -+ * Now we may need to insert the remaining new_len. We don't need to -+ * free the string passed back because MzScheme has control of that -+ * memory. -+ */ -+ while (i < new_len) -+ { -+ if (ml_append((linenr_T)(lo + i - 1), -+ (char_u *)array[i], 0, FALSE) == FAIL) -+ { -+ curbuf = savebuf; -+ free_array(array); -+ raise_vim_exn(_("cannot insert line")); -+ } -+ ++i; -+ ++extra; -+ } -+ MZ_GC_UNREG(); -+ free_array(array); - } -- ++i; -- ++extra; -- } - -- /* -- * Adjust marks. Invalidate any which lie in the -- * changed range, and move any in the remainder of the buffer. -- */ -- mark_adjust((linenr_T)lo, (linenr_T)(hi - 1), (long)MAXLNUM, (long)extra); -- changed_lines((linenr_T)lo, 0, (linenr_T)hi, (long)extra); -+ /* -+ * Adjust marks. Invalidate any which lie in the -+ * changed range, and move any in the remainder of the buffer. -+ */ -+ mark_adjust((linenr_T)lo, (linenr_T)(hi - 1), (long)MAXLNUM, (long)extra); -+ changed_lines((linenr_T)lo, 0, (linenr_T)hi, (long)extra); - -- if (buf->buf == curwin->w_buffer) -- mz_fix_cursor(lo, hi, extra); -- curbuf = savebuf; -+ if (buf->buf == curwin->w_buffer) -+ mz_fix_cursor(lo, hi, extra); -+ curbuf = savebuf; - -- raise_if_error(); -- return scheme_void; -+ MZ_GC_UNREG(); -+ raise_if_error(); -+ return scheme_void; -+ } - } - - /* - * (insert-buff-line-list {linenr} {string/string-list} [buffer]) - * -- * Insert a number of lines into the specified buffer after the specifed line. -+ * Insert a number of lines into the specified buffer after the specified line. - * The line number is in Vim format (1-based). The lines to be inserted are - * given as an MzScheme list of string objects or as a single string. The lines - * to be added are checked for validity and correct format. Errors are - * returned as a value of FAIL. The return value is OK on success. - * If OK is returned and len_change is not NULL, *len_change -@@ -2179,19 +2394,19 @@ set_buffer_line_list(void *data, int arg - */ - static Scheme_Object * - insert_buffer_line_list(void *data, int argc, Scheme_Object **argv) - { - Vim_Prim *prim = (Vim_Prim *)data; -- vim_mz_buffer *buf; -- Scheme_Object *list; -- Scheme_Object *line; -- Scheme_Object *rest; -- char **array; -- char *str; -- buf_T *savebuf; -+ vim_mz_buffer *buf = NULL; -+ Scheme_Object *list = NULL; -+ char *str = NULL; - int i, n, size; - -+ MZ_GC_DECL_REG(1); -+ MZ_GC_VAR_IN_REG(0, list); -+ MZ_GC_REG(); -+ - #ifdef HAVE_SANDBOX - sandbox_check(); - #endif - /* - * First of all, we check the type of the supplied MzScheme object. -@@ -2206,93 +2421,103 @@ insert_buffer_line_list(void *data, int - - if (n != 0) /* 0 can be used in insert */ - check_line_range(n, buf->buf); - if (SCHEME_STRINGP(list)) - { -- str = string_to_line(list); -+ buf_T *savebuf = curbuf; - -- savebuf = curbuf; -+ str = string_to_line(list); - curbuf = buf->buf; - - if (u_save((linenr_T)n, (linenr_T)(n+1)) == FAIL) - { - curbuf = savebuf; -+ vim_free(str); - raise_vim_exn(_("cannot save undo information")); - } - else if (ml_append((linenr_T)n, (char_u *)str, 0, FALSE) == FAIL) - { - curbuf = savebuf; -+ vim_free(str); - raise_vim_exn(_("cannot insert line")); - } - else -+ { -+ vim_free(str); - appended_lines_mark((linenr_T)n, 1L); -+ } - - curbuf = savebuf; - update_screen(VALID); - -+ MZ_GC_UNREG(); - raise_if_error(); - return scheme_void; - } - - /* List */ - size = scheme_proper_list_length(list); -+ MZ_GC_CHECK(); - if (size < 0) /* improper or cyclic list */ - scheme_wrong_type(prim->name, "proper list", - 2, argc, argv); -- -- /* Using MzScheme allocator, so we don't need to free this and -- * can safely keep pointers to GC collected strings -- */ -- array = (char **)scheme_malloc_fail_ok( -- scheme_malloc, (unsigned)(size * sizeof(char *))); -- -- rest = list; -- for (i = 0; i < size; ++i) -+ else - { -- line = SCHEME_CAR(rest); -- rest = SCHEME_CDR(rest); -- array[i] = string_to_line(line); -- } -+ Scheme_Object *line = NULL; -+ Scheme_Object *rest = NULL; -+ char **array; -+ buf_T *savebuf = curbuf; -+ -+ MZ_GC_DECL_REG(2); -+ MZ_GC_VAR_IN_REG(0, line); -+ MZ_GC_VAR_IN_REG(1, rest); -+ MZ_GC_REG(); - -- savebuf = curbuf; -- curbuf = buf->buf; -+ array = (char **)alloc(size * sizeof(char *)); -+ vim_memset(array, 0, size * sizeof(char *)); - -- if (u_save((linenr_T)n, (linenr_T)(n + 1)) == FAIL) -- { -- curbuf = savebuf; -- raise_vim_exn(_("cannot save undo information")); -- } -- else -- { -+ rest = list; - for (i = 0; i < size; ++i) -- if (ml_append((linenr_T)(n + i), (char_u *)array[i], -- 0, FALSE) == FAIL) -- { -- curbuf = savebuf; -- raise_vim_exn(_("cannot insert line")); -- } -+ { -+ line = SCHEME_CAR(rest); -+ rest = SCHEME_CDR(rest); -+ array[i] = string_to_line(line); -+ } - -- if (i > 0) -- appended_lines_mark((linenr_T)n, (long)i); -- } -+ curbuf = buf->buf; - -- curbuf = savebuf; -- update_screen(VALID); -+ if (u_save((linenr_T)n, (linenr_T)(n + 1)) == FAIL) -+ { -+ curbuf = savebuf; -+ free_array(array); -+ raise_vim_exn(_("cannot save undo information")); -+ } -+ else -+ { -+ for (i = 0; i < size; ++i) -+ if (ml_append((linenr_T)(n + i), (char_u *)array[i], -+ 0, FALSE) == FAIL) -+ { -+ curbuf = savebuf; -+ free_array(array); -+ raise_vim_exn(_("cannot insert line")); -+ } - -+ if (i > 0) -+ appended_lines_mark((linenr_T)n, (long)i); -+ } -+ free_array(array); -+ MZ_GC_UNREG(); -+ curbuf = savebuf; -+ update_screen(VALID); -+ } -+ -+ MZ_GC_UNREG(); - raise_if_error(); - return scheme_void; - } - --/* (get-buff-namespace [buffer]) */ -- static Scheme_Object * --get_buffer_namespace(void *data, int argc, Scheme_Object **argv) --{ -- Vim_Prim *prim = (Vim_Prim *)data; -- -- return (Scheme_Object *)get_buffer_arg(prim->name, 0, argc, argv)->env; --} -- - /* - * Predicates - */ - /* (buff? obj) */ - static Scheme_Object * -@@ -2343,44 +2568,395 @@ vim_window_validp(void *data, int argc, - */ - - /* - * Convert an MzScheme string into a Vim line. - * -- * The result is in allocated memory. All internal nulls are replaced by -- * newline characters. It is an error for the string to contain newline -- * characters. -+ * All internal nulls are replaced by newline characters. -+ * It is an error for the string to contain newline characters. - * -+ * Returns pointer to Vim allocated memory - */ - static char * - string_to_line(Scheme_Object *obj) - { -- char *str; -+ char *scheme_str = NULL; -+ char *vim_str = NULL; - long len; - int i; - -- str = scheme_display_to_string(obj, &len); -+ scheme_str = scheme_display_to_string(obj, &len); - - /* Error checking: String must not contain newlines, as we - * are replacing a single line, and we must replace it with - * a single line. - */ -- if (memchr(str, '\n', len)) -+ if (memchr(scheme_str, '\n', len)) - scheme_signal_error(_("string cannot contain newlines")); - -+ vim_str = (char *)alloc(len + 1); -+ - /* Create a copy of the string, with internal nulls replaced by - * newline characters, as is the vim convention. - */ - for (i = 0; i < len; ++i) - { -- if (str[i] == '\0') -- str[i] = '\n'; -+ if (scheme_str[i] == '\0') -+ vim_str[i] = '\n'; -+ else -+ vim_str[i] = scheme_str[i]; -+ } -+ -+ vim_str[i] = '\0'; -+ -+ MZ_GC_CHECK(); -+ return vim_str; -+} -+ -+#ifdef FEAT_EVAL -+/* -+ * Convert Vim value into MzScheme, adopted from if_python.c -+ */ -+ static Scheme_Object * -+vim_to_mzscheme(typval_T *vim_value, int depth, Scheme_Hash_Table *visited) -+{ -+ Scheme_Object *result = NULL; -+ int new_value = TRUE; -+ -+ MZ_GC_DECL_REG(1); -+ MZ_GC_VAR_IN_REG(0, result); -+ MZ_GC_REG(); -+ -+ /* Avoid infinite recursion */ -+ if (depth > 100) -+ { -+ MZ_GC_UNREG(); -+ return scheme_void; -+ } -+ -+ /* Check if we run into a recursive loop. The item must be in visited -+ * then and we can use it again. -+ */ -+ result = scheme_hash_get(visited, (Scheme_Object *)vim_value); -+ MZ_GC_CHECK(); -+ if (result != NULL) /* found, do nothing */ -+ new_value = FALSE; -+ else if (vim_value->v_type == VAR_STRING) -+ { -+ result = scheme_make_string((char *)vim_value->vval.v_string); -+ MZ_GC_CHECK(); -+ } -+ else if (vim_value->v_type == VAR_NUMBER) -+ { -+ result = scheme_make_integer((long)vim_value->vval.v_number); -+ MZ_GC_CHECK(); -+ } -+# ifdef FEAT_FLOAT -+ else if (vim_value->v_type == VAR_FLOAT) -+ { -+ result = scheme_make_double((double)vim_value->vval.v_float); -+ MZ_GC_CHECK(); -+ } -+# endif -+ else if (vim_value->v_type == VAR_LIST) -+ { -+ list_T *list = vim_value->vval.v_list; -+ listitem_T *curr; -+ -+ if (list == NULL || list->lv_first == NULL) -+ result = scheme_null; -+ else -+ { -+ Scheme_Object *obj = NULL; -+ -+ MZ_GC_DECL_REG(1); -+ MZ_GC_VAR_IN_REG(0, obj); -+ MZ_GC_REG(); -+ -+ curr = list->lv_last; -+ obj = vim_to_mzscheme(&curr->li_tv, depth + 1, visited); -+ result = scheme_make_pair(obj, scheme_null); -+ MZ_GC_CHECK(); -+ -+ while (curr != list->lv_first) -+ { -+ curr = curr->li_prev; -+ obj = vim_to_mzscheme(&curr->li_tv, depth + 1, visited); -+ result = scheme_make_pair(obj, result); -+ MZ_GC_CHECK(); -+ } -+ } -+ MZ_GC_UNREG(); -+ } -+ else if (vim_value->v_type == VAR_DICT) -+ { -+ Scheme_Object *key = NULL; -+ Scheme_Object *obj = NULL; -+ -+ MZ_GC_DECL_REG(2); -+ MZ_GC_VAR_IN_REG(0, key); -+ MZ_GC_VAR_IN_REG(1, obj); -+ MZ_GC_REG(); -+ -+ result = (Scheme_Object *)scheme_make_hash_table(SCHEME_hash_ptr); -+ MZ_GC_CHECK(); -+ if (vim_value->vval.v_dict != NULL) -+ { -+ hashtab_T *ht = &vim_value->vval.v_dict->dv_hashtab; -+ long_u todo = ht->ht_used; -+ hashitem_T *hi; -+ dictitem_T *di; -+ -+ for (hi = ht->ht_array; todo > 0; ++hi) -+ { -+ if (!HASHITEM_EMPTY(hi)) -+ { -+ --todo; -+ -+ di = dict_lookup(hi); -+ obj = vim_to_mzscheme(&di->di_tv, depth + 1, visited); -+ key = scheme_make_string((char *)hi->hi_key); -+ MZ_GC_CHECK(); -+ scheme_hash_set((Scheme_Hash_Table *)result, key, obj); -+ MZ_GC_CHECK(); -+ } -+ } -+ } -+ MZ_GC_UNREG(); -+ } -+ else -+ { -+ result = scheme_void; -+ new_value = FALSE; -+ } -+ if (new_value) -+ { -+ scheme_hash_set(visited, (Scheme_Object *)vim_value, result); -+ MZ_GC_CHECK(); -+ } -+ MZ_GC_UNREG(); -+ return result; -+} -+ -+ static int -+mzscheme_to_vim(Scheme_Object *obj, typval_T *tv, int depth, -+ Scheme_Hash_Table *visited) -+{ -+ int status = OK; -+ typval_T *found; -+ MZ_GC_CHECK(); -+ if (depth > 100) /* limit the deepest recursion level */ -+ { -+ tv->v_type = VAR_NUMBER; -+ tv->vval.v_number = 0; -+ return FAIL; -+ } -+ -+ found = (typval_T *)scheme_hash_get(visited, obj); -+ if (found != NULL) -+ copy_tv(found, tv); -+ else if (SCHEME_VOIDP(obj)) -+ { -+ tv->v_type = VAR_NUMBER; -+ tv->vval.v_number = 0; -+ } -+ else if (SCHEME_INTP(obj)) -+ { -+ tv->v_type = VAR_NUMBER; -+ tv->vval.v_number = SCHEME_INT_VAL(obj); -+ } -+ else if (SCHEME_BOOLP(obj)) -+ { -+ tv->v_type = VAR_NUMBER; -+ tv->vval.v_number = SCHEME_TRUEP(obj); -+ } -+# ifdef FEAT_FLOAT -+ else if (SCHEME_DBLP(obj)) -+ { -+ tv->v_type = VAR_FLOAT; -+ tv->vval.v_float = SCHEME_DBL_VAL(obj); -+ } -+# endif -+ else if (SCHEME_STRINGP(obj)) -+ { -+ tv->v_type = VAR_STRING; -+ tv->vval.v_string = vim_strsave((char_u *)SCHEME_STR_VAL(obj)); -+ } -+ else if (SCHEME_VECTORP(obj) || SCHEME_NULLP(obj) -+ || SCHEME_PAIRP(obj) || SCHEME_MUTABLE_PAIRP(obj)) -+ { -+ list_T *list = list_alloc(); -+ if (list == NULL) -+ status = FAIL; -+ else -+ { -+ int i; -+ Scheme_Object *curr = NULL; -+ Scheme_Object *cval = NULL; -+ /* temporary var to hold current element of vectors and pairs */ -+ typval_T *v; -+ -+ MZ_GC_DECL_REG(2); -+ MZ_GC_VAR_IN_REG(0, curr); -+ MZ_GC_VAR_IN_REG(1, cval); -+ MZ_GC_REG(); -+ -+ tv->v_type = VAR_LIST; -+ tv->vval.v_list = list; -+ ++list->lv_refcount; -+ -+ v = (typval_T *)alloc(sizeof(typval_T)); -+ if (v == NULL) -+ status = FAIL; -+ else -+ { -+ /* add the value in advance to allow handling of self-referencial -+ * data structures */ -+ typval_T *visited_tv = (typval_T *)alloc(sizeof(typval_T)); -+ copy_tv(tv, visited_tv); -+ scheme_hash_set(visited, obj, (Scheme_Object *)visited_tv); -+ -+ if (SCHEME_VECTORP(obj)) -+ { -+ for (i = 0; i < SCHEME_VEC_SIZE(obj); ++i) -+ { -+ cval = SCHEME_VEC_ELS(obj)[i]; -+ status = mzscheme_to_vim(cval, v, depth + 1, visited); -+ if (status == FAIL) -+ break; -+ status = list_append_tv(list, v); -+ clear_tv(v); -+ if (status == FAIL) -+ break; -+ } -+ } -+ else if (SCHEME_PAIRP(obj) || SCHEME_MUTABLE_PAIRP(obj)) -+ { -+ for (curr = obj; -+ SCHEME_PAIRP(curr) || SCHEME_MUTABLE_PAIRP(curr); -+ curr = SCHEME_CDR(curr)) -+ { -+ cval = SCHEME_CAR(curr); -+ status = mzscheme_to_vim(cval, v, depth + 1, visited); -+ if (status == FAIL) -+ break; -+ status = list_append_tv(list, v); -+ clear_tv(v); -+ if (status == FAIL) -+ break; -+ } -+ /* impoper list not terminated with null -+ * need to handle the last element */ -+ if (status == OK && !SCHEME_NULLP(curr)) -+ { -+ status = mzscheme_to_vim(cval, v, depth + 1, visited); -+ if (status == OK) -+ { -+ status = list_append_tv(list, v); -+ clear_tv(v); -+ } -+ } -+ } -+ /* nothing to do for scheme_null */ -+ vim_free(v); -+ } -+ MZ_GC_UNREG(); -+ } -+ } -+ else if (SCHEME_HASHTP(obj)) -+ { -+ int i; -+ dict_T *dict; -+ Scheme_Object *key = NULL; -+ Scheme_Object *val = NULL; -+ -+ MZ_GC_DECL_REG(2); -+ MZ_GC_VAR_IN_REG(0, key); -+ MZ_GC_VAR_IN_REG(1, val); -+ MZ_GC_REG(); -+ -+ dict = dict_alloc(); -+ if (dict == NULL) -+ status = FAIL; -+ else -+ { -+ typval_T *visited_tv = (typval_T *)alloc(sizeof(typval_T)); -+ -+ tv->v_type = VAR_DICT; -+ tv->vval.v_dict = dict; -+ ++dict->dv_refcount; -+ -+ copy_tv(tv, visited_tv); -+ scheme_hash_set(visited, obj, (Scheme_Object *)visited_tv); -+ -+ for (i = 0; i < ((Scheme_Hash_Table *)obj)->size; ++i) -+ { -+ if (((Scheme_Hash_Table *) obj)->vals[i] != NULL) -+ { -+ /* generate item for `diplay'ed Scheme key */ -+ dictitem_T *item = dictitem_alloc((char_u *)string_to_line( -+ ((Scheme_Hash_Table *) obj)->keys[i])); -+ /* convert Scheme val to Vim and add it to the dict */ -+ if (mzscheme_to_vim(((Scheme_Hash_Table *) obj)->vals[i], -+ &item->di_tv, depth + 1, visited) == FAIL -+ || dict_add(dict, item) == FAIL) -+ { -+ dictitem_free(item); -+ status = FAIL; -+ break; -+ } -+ } -+ -+ } -+ } -+ MZ_GC_UNREG(); -+ } -+ else -+ { -+ /* `display' any other value to string */ -+ tv->v_type = VAR_STRING; -+ tv->vval.v_string = (char_u *)string_to_line(obj); - } -+ return status; -+} -+ -+ void -+do_mzeval(char_u *str, typval_T *rettv) -+{ -+ int i; -+ Scheme_Object *ret = NULL; -+ Scheme_Hash_Table *visited = NULL; - -- str[i] = '\0'; -+ MZ_GC_DECL_REG(2); -+ MZ_GC_VAR_IN_REG(0, ret); -+ MZ_GC_VAR_IN_REG(0, visited); -+ MZ_GC_REG(); -+ -+ if (mzscheme_init()) -+ { -+ MZ_GC_UNREG(); -+ return; -+ } - -- return str; -+ MZ_GC_CHECK(); -+ visited = scheme_make_hash_table(SCHEME_hash_ptr); -+ MZ_GC_CHECK(); -+ -+ if (eval_with_exn_handling(str, do_eval, &ret) == OK) -+ mzscheme_to_vim(ret, rettv, 1, visited); -+ -+ for (i = 0; i < visited->size; ++i) -+ { -+ /* free up remembered objects */ -+ if (visited->vals[i] != NULL) -+ { -+ free_tv((typval_T *)visited->vals[i]); -+ } -+ } -+ -+ MZ_GC_UNREG(); - } -+#endif - - /* - * Check to see whether a Vim error has been reported, or a keyboard - * interrupt (from vim --> got_int) has been detected. - */ -@@ -2392,82 +2968,119 @@ vim_error_check(void) - - /* - * register Scheme exn:vim - */ - static void --register_vim_exn(Scheme_Env *env) -+register_vim_exn(void) - { -- Scheme_Object *exn_name = scheme_intern_symbol("exn:vim"); -+ int nc = 0; -+ int i; -+ Scheme_Object *struct_exn = NULL; -+ Scheme_Object *exn_name = NULL; -+ -+ MZ_GC_DECL_REG(2); -+ MZ_GC_VAR_IN_REG(0, struct_exn); -+ MZ_GC_VAR_IN_REG(1, exn_name); -+ MZ_GC_REG(); -+ -+ exn_name = scheme_intern_symbol("exn:vim"); -+ MZ_GC_CHECK(); -+ struct_exn = scheme_builtin_value("struct:exn"); -+ MZ_GC_CHECK(); - - if (vim_exn == NULL) - vim_exn = scheme_make_struct_type(exn_name, -- scheme_builtin_value("struct:exn"), NULL, 0, 0, NULL, NULL -+ struct_exn, NULL, 0, 0, NULL, NULL - #if MZSCHEME_VERSION_MAJOR >= 299 - , NULL - #endif - ); - -- if (vim_exn_values == NULL) -- { -- int nc = 0; - -- Scheme_Object **exn_names = scheme_make_struct_names( -- exn_name, scheme_null, 0, &nc); -- Scheme_Object **exn_values = scheme_make_struct_values( -- vim_exn, exn_names, nc, 0); -- -- vim_exn_names = scheme_make_vector(nc, scheme_false); -- vim_exn_values = scheme_make_vector(nc, scheme_false); -- /* remember names and values */ -- mch_memmove(SCHEME_VEC_ELS(vim_exn_names), exn_names, -- nc * sizeof(Scheme_Object *)); -- mch_memmove(SCHEME_VEC_ELS(vim_exn_values), exn_values, -- nc * sizeof(Scheme_Object *)); -+ { -+ Scheme_Object **tmp = NULL; -+ Scheme_Object *exn_names[5] = {NULL, NULL, NULL, NULL, NULL}; -+ Scheme_Object *exn_values[5] = {NULL, NULL, NULL, NULL, NULL}; -+ MZ_GC_DECL_REG(6); -+ MZ_GC_ARRAY_VAR_IN_REG(0, exn_names, 5); -+ MZ_GC_ARRAY_VAR_IN_REG(3, exn_values, 5); -+ MZ_GC_REG(); -+ -+ tmp = scheme_make_struct_names(exn_name, scheme_null, 0, &nc); -+ assert(nc <= 5); -+ mch_memmove(exn_names, tmp, nc * sizeof(Scheme_Object *)); -+ MZ_GC_CHECK(); -+ -+ tmp = scheme_make_struct_values(vim_exn, exn_names, nc, 0); -+ mch_memmove(exn_values, tmp, nc * sizeof(Scheme_Object *)); -+ MZ_GC_CHECK(); -+ -+ for (i = 0; i < nc; i++) -+ { -+ scheme_add_global_symbol(exn_names[i], -+ exn_values[i], environment); -+ MZ_GC_CHECK(); -+ } -+ MZ_GC_UNREG(); - } -- -- add_vim_exn(env); --} -- --/* -- * Add stuff of exn:vim to env -- */ -- static void --add_vim_exn(Scheme_Env *env) --{ -- int i; -- -- for (i = 0; i < SCHEME_VEC_SIZE(vim_exn_values); i++) -- scheme_add_global_symbol(SCHEME_VEC_ELS(vim_exn_names)[i], -- SCHEME_VEC_ELS(vim_exn_values)[i], env); -+ MZ_GC_UNREG(); - } - - /* - * raise exn:vim, may be with additional info string - */ - void - raise_vim_exn(const char *add_info) - { -- Scheme_Object *argv[2]; -- char_u *fmt = _("Vim error: ~a"); -+ char *fmt = _("Vim error: ~a"); -+ Scheme_Object *argv[2] = {NULL, NULL}; -+ Scheme_Object *exn = NULL; -+ -+ MZ_GC_DECL_REG(4); -+ MZ_GC_ARRAY_VAR_IN_REG(0, argv, 2); -+ MZ_GC_VAR_IN_REG(3, exn); -+ MZ_GC_REG(); - - if (add_info != NULL) - { -- Scheme_Object *info = scheme_make_string(add_info); -- argv[0] = scheme_byte_string_to_char_string(scheme_make_string( -- scheme_format(fmt, strlen(fmt), 1, &info, NULL))); -+ char *c_string = NULL; -+ Scheme_Object *byte_string = NULL; -+ Scheme_Object *info = NULL; -+ -+ MZ_GC_DECL_REG(3); -+ MZ_GC_VAR_IN_REG(0, c_string); -+ MZ_GC_VAR_IN_REG(1, byte_string); -+ MZ_GC_VAR_IN_REG(2, info); -+ MZ_GC_REG(); -+ -+ info = scheme_make_string(add_info); -+ MZ_GC_CHECK(); -+ c_string = scheme_format(fmt, STRLEN(fmt), 1, &info, NULL); -+ MZ_GC_CHECK(); -+ byte_string = scheme_make_string(c_string); -+ MZ_GC_CHECK(); -+ argv[0] = scheme_byte_string_to_char_string(byte_string); -+ MZ_GC_CHECK(); - SCHEME_SET_IMMUTABLE(argv[0]); -+ MZ_GC_UNREG(); - } - else - argv[0] = scheme_make_string(_("Vim error")); -+ MZ_GC_CHECK(); - - #if MZSCHEME_VERSION_MAJOR < 360 - argv[1] = scheme_current_continuation_marks(); -+ MZ_GC_CHECK(); - #else - argv[1] = scheme_current_continuation_marks(NULL); -+ MZ_GC_CHECK(); - #endif - -- scheme_raise(scheme_make_struct_instance(vim_exn, 2, argv)); -+ exn = scheme_make_struct_instance(vim_exn, 2, argv); -+ MZ_GC_CHECK(); -+ scheme_raise(exn); -+ MZ_GC_UNREG(); - } - - void - raise_if_error(void) - { -@@ -2570,10 +3183,12 @@ mz_fix_cursor(int lo, int hi, int extra) - else if (extra < 0) - { - curwin->w_cursor.lnum = lo; - check_cursor(); - } -+ else -+ check_cursor_col(); - changed_cline_bef_curs(); - } - invalidate_botline(); - } - -@@ -2595,11 +3210,10 @@ static Vim_Prim prims[]= - {get_next_buffer, "get-next-buff", 0, 1}, - {get_prev_buffer, "get-prev-buff", 0, 1}, - {mzscheme_open_buffer, "open-buff", 1, 1}, - {get_buffer_by_name, "get-buff-by-name", 1, 1}, - {get_buffer_by_num, "get-buff-by-num", 1, 1}, -- {get_buffer_namespace, "get-buff-namespace", 0, 1}, - /* - * Window-related commands - */ - {get_curr_win, "curr-win", 0, 0}, - {get_window_count, "win-count", 0, 0}, -@@ -2653,27 +3267,39 @@ get_vim_curr_window(void) - else - return (vim_mz_window *)curwin->w_mzscheme_ref; - } - - static void --make_modules(Scheme_Env *env) -+make_modules() - { -- int i; -- Scheme_Env *mod; -- -- mod = scheme_primitive_module(scheme_intern_symbol("vimext"), env); -+ int i; -+ Scheme_Env *mod = NULL; -+ Scheme_Object *vimext_symbol = NULL; -+ Scheme_Object *closed_prim = NULL; -+ -+ MZ_GC_DECL_REG(3); -+ MZ_GC_VAR_IN_REG(0, mod); -+ MZ_GC_VAR_IN_REG(1, vimext_symbol); -+ MZ_GC_VAR_IN_REG(2, closed_prim); -+ MZ_GC_REG(); -+ -+ vimext_symbol = scheme_intern_symbol("vimext"); -+ MZ_GC_CHECK(); -+ mod = scheme_primitive_module(vimext_symbol, environment); -+ MZ_GC_CHECK(); - /* all prims made closed so they can access their own names */ -- for (i = 0; i < sizeof(prims)/sizeof(prims[0]); i++) -+ for (i = 0; i < (int)(sizeof(prims)/sizeof(prims[0])); i++) - { - Vim_Prim *prim = prims + i; -- scheme_add_global(prim->name, -- scheme_make_closed_prim_w_arity(prim->prim, prim, prim->name, -- prim->mina, prim->maxa), -- mod); -+ closed_prim = scheme_make_closed_prim_w_arity(prim->prim, prim, prim->name, -+ prim->mina, prim->maxa); -+ scheme_add_global(prim->name, closed_prim, mod); -+ MZ_GC_CHECK(); - } -- scheme_add_global("global-namespace", (Scheme_Object *)environment, mod); - scheme_finish_primitive_module(mod); -+ MZ_GC_CHECK(); -+ MZ_GC_UNREG(); - } - - #ifdef HAVE_SANDBOX - static Scheme_Object *M_write = NULL; - static Scheme_Object *M_read = NULL; -@@ -2697,25 +3323,29 @@ sandbox_file_guard(int argc, Scheme_Obje - - if (M_write == NULL) - { - MZ_REGISTER_STATIC(M_write); - M_write = scheme_intern_symbol("write"); -+ MZ_GC_CHECK(); - } - if (M_read == NULL) - { - MZ_REGISTER_STATIC(M_read); - M_read = scheme_intern_symbol("read"); -+ MZ_GC_CHECK(); - } - if (M_execute == NULL) - { - MZ_REGISTER_STATIC(M_execute); - M_execute = scheme_intern_symbol("execute"); -+ MZ_GC_CHECK(); - } - if (M_delete == NULL) - { - MZ_REGISTER_STATIC(M_delete); - M_delete = scheme_intern_symbol("delete"); -+ MZ_GC_CHECK(); - } - - while (!SCHEME_NULLP(requested_access)) - { - Scheme_Object *item = SCHEME_CAR(requested_access); ---- vim72.orig/src/if_mzsch.h -+++ vim72/src/if_mzsch.h -@@ -9,10 +9,11 @@ - # define __CYGWIN32__ - #endif - - /* #ifdef needed for "make depend" */ - #ifdef FEAT_MZSCHEME -+# include <schvers.h> - # include <scheme.h> - #endif - - #ifdef __MINGW32__ - # undef __CYGWIN32__ -@@ -44,6 +45,33 @@ - # define SCHEME_BYTE_STRLEN_VAL SCHEME_STRLEN_VAL - # define SCHEME_BYTE_STR_VAL SCHEME_STR_VAL - # define scheme_byte_string_to_char_string(obj) (obj) - #endif - -+/* Precise GC macros */ -+#ifndef MZ_GC_DECL_REG -+# define MZ_GC_DECL_REG(size) /* empty */ -+#endif -+#ifndef MZ_GC_VAR_IN_REG -+# define MZ_GC_VAR_IN_REG(x, v) /* empty */ -+#endif -+#ifndef MZ_GC_ARRAY_VAR_IN_REG -+# define MZ_GC_ARRAY_VAR_IN_REG(x, v, l) /* empty */ -+#endif -+#ifndef MZ_GC_REG -+# define MZ_GC_REG() /* empty */ -+#endif -+#ifndef MZ_GC_UNREG -+# define MZ_GC_UNREG() /* empty */ -+#endif -+ -+#ifdef MZSCHEME_FORCE_GC -+/* -+ * force garbage collection to check all references are registered -+ * seg faults will indicate not registered refs -+ */ -+# define MZ_GC_CHECK() scheme_collect_garbage(); -+#else -+# define MZ_GC_CHECK() /* empty */ -+#endif -+ - #endif /* _IF_MZSCH_H_ */ ---- vim72.orig/src/if_ole.cpp -+++ vim72/src/if_ole.cpp -@@ -351,13 +351,17 @@ CVim::SendKeys(BSTR keys) - vim_free(str); - return E_INVALIDARG; - } - - /* Pass the string to the main input loop. The memory will be freed when -- * the message is processed. -+ * the message is processed. Except for an empty message, we don't need -+ * to post it then. - */ -- PostMessage(NULL, WM_OLE, 0, (LPARAM)str); -+ if (*str == NUL) -+ vim_free(str); -+ else -+ PostMessage(NULL, WM_OLE, 0, (LPARAM)str); - - return S_OK; - } - - STDMETHODIMP ---- vim72.orig/src/if_perl.xs -+++ vim72/src/if_perl.xs -@@ -60,10 +60,15 @@ - #endif - #if (PERL_REVISION == 5) && (PERL_VERSION >= 9) - # define PERL589_OR_LATER - #endif - -+#if (PERL_REVISION == 5) && ((PERL_VERSION > 10) || \ -+ (PERL_VERSION == 10) && (PERL_SUBVERSION >= 1)) -+# define PERL5101_OR_LATER -+#endif -+ - #ifndef pTHX - # define pTHX void - # define pTHX_ - #endif - -@@ -91,10 +96,13 @@ EXTERN_C void boot_DynaLoader __ARGS((pT - # define perl_run dll_perl_run - # define perl_destruct dll_perl_destruct - # define perl_free dll_perl_free - # define Perl_get_context dll_Perl_get_context - # define Perl_croak dll_Perl_croak -+# ifdef PERL5101_OR_LATER -+# define Perl_croak_xs_usage dll_Perl_croak_xs_usage -+# endif - # ifndef PROTO - # define Perl_croak_nocontext dll_Perl_croak_nocontext - # define Perl_call_argv dll_Perl_call_argv - # define Perl_call_pv dll_Perl_call_pv - # define Perl_eval_sv dll_Perl_eval_sv -@@ -134,10 +142,13 @@ EXTERN_C void boot_DynaLoader __ARGS((pT - #ifdef PERL589_OR_LATER - # define Perl_sv_2iv_flags dll_Perl_sv_2iv_flags - # define Perl_newXS_flags dll_Perl_newXS_flags - #endif - # define Perl_sv_free dll_Perl_sv_free -+# if (PERL_REVISION == 5) && (PERL_VERSION >= 10) -+# define Perl_sv_free2 dll_Perl_sv_free2 -+# endif - # define Perl_sv_isa dll_Perl_sv_isa - # define Perl_sv_magic dll_Perl_sv_magic - # define Perl_sv_setiv dll_Perl_sv_setiv - # define Perl_sv_setpv dll_Perl_sv_setpv - # define Perl_sv_setpvn dll_Perl_sv_setpvn -@@ -161,11 +172,11 @@ EXTERN_C void boot_DynaLoader __ARGS((pT - # define Perl_Idefgv_ptr dll_Perl_Idefgv_ptr - # define Perl_Ierrgv_ptr dll_Perl_Ierrgv_ptr - # define Perl_Isv_yes_ptr dll_Perl_Isv_yes_ptr - # define boot_DynaLoader dll_boot_DynaLoader - --# define Perl_sys_init3 dll_Perl_sys_init3 -+# define Perl_sys_init dll_Perl_sys_init - # define Perl_sys_term dll_Perl_sys_term - # define Perl_ISv_ptr dll_Perl_ISv_ptr - # define Perl_Istack_max_ptr dll_Perl_Istack_max_ptr - # define Perl_Istack_base_ptr dll_Perl_Istack_base_ptr - # define Perl_Itmps_ix_ptr dll_Perl_Itmps_ix_ptr -@@ -197,10 +208,13 @@ static void (*perl_destruct)(PerlInterpr - static void (*perl_free)(PerlInterpreter*); - static int (*perl_run)(PerlInterpreter*); - static int (*perl_parse)(PerlInterpreter*, XSINIT_t, int, char**, char**); - static void* (*Perl_get_context)(void); - static void (*Perl_croak)(pTHX_ const char*, ...); -+#ifdef PERL5101_OR_LATER -+static void (*Perl_croak_xs_usage)(pTHX_ const CV *const, const char *const params); -+#endif - static void (*Perl_croak_nocontext)(const char*, ...); - static I32 (*Perl_dowantarray)(pTHX); - static void (*Perl_free_tmps)(pTHX); - static HV* (*Perl_gv_stashpv)(pTHX_ const char*, I32); - static void (*Perl_markstack_grow)(pTHX); -@@ -266,11 +280,12 @@ static GV** (*Perl_Idefgv_ptr)(register - static GV** (*Perl_Ierrgv_ptr)(register PerlInterpreter*); - static SV* (*Perl_Isv_yes_ptr)(register PerlInterpreter*); - static void (*boot_DynaLoader)_((pTHX_ CV*)); - - #if (PERL_REVISION == 5) && (PERL_VERSION >= 10) --static void (*Perl_sys_init3)(int* argc, char*** argv, char*** env); -+static void (*Perl_sv_free2)(pTHX_ SV*); -+static void (*Perl_sys_init)(int* argc, char*** argv); - static void (*Perl_sys_term)(void); - static SV** (*Perl_ISv_ptr)(register PerlInterpreter*); - static SV*** (*Perl_Istack_max_ptr)(register PerlInterpreter*); - static SV*** (*Perl_Istack_base_ptr)(register PerlInterpreter*); - static XPV** (*Perl_IXpv_ptr)(register PerlInterpreter*); -@@ -300,10 +315,13 @@ static struct { - {"perl_free", (PERL_PROC*)&perl_free}, - {"perl_run", (PERL_PROC*)&perl_run}, - {"perl_parse", (PERL_PROC*)&perl_parse}, - {"Perl_get_context", (PERL_PROC*)&Perl_get_context}, - {"Perl_croak", (PERL_PROC*)&Perl_croak}, -+#ifdef PERL5101_OR_LATER -+ {"Perl_croak_xs_usage", (PERL_PROC*)&Perl_croak_xs_usage}, -+#endif - {"Perl_croak_nocontext", (PERL_PROC*)&Perl_croak_nocontext}, - {"Perl_dowantarray", (PERL_PROC*)&Perl_dowantarray}, - {"Perl_free_tmps", (PERL_PROC*)&Perl_free_tmps}, - {"Perl_gv_stashpv", (PERL_PROC*)&Perl_gv_stashpv}, - {"Perl_markstack_grow", (PERL_PROC*)&Perl_markstack_grow}, -@@ -365,11 +383,12 @@ static struct { - {"Perl_Tmarkstack_max_ptr", (PERL_PROC*)&Perl_Tmarkstack_max_ptr}, - {"Perl_TSv_ptr", (PERL_PROC*)&Perl_TSv_ptr}, - {"Perl_TXpv_ptr", (PERL_PROC*)&Perl_TXpv_ptr}, - {"Perl_Tna_ptr", (PERL_PROC*)&Perl_Tna_ptr}, - #else -- {"Perl_sys_init3", (PERL_PROC*)&Perl_sys_init3}, -+ {"Perl_sv_free2", (PERL_PROC*)&Perl_sv_free2}, -+ {"Perl_sys_init", (PERL_PROC*)&Perl_sys_init}, - {"Perl_sys_term", (PERL_PROC*)&Perl_sys_term}, - {"Perl_ISv_ptr", (PERL_PROC*)&Perl_ISv_ptr}, - {"Perl_Istack_sp_ptr", (PERL_PROC*)&Perl_Istack_sp_ptr}, - {"Perl_Iop_ptr", (PERL_PROC*)&Perl_Iop_ptr}, - {"Perl_Istack_base_ptr", (PERL_PROC*)&Perl_Istack_base_ptr}, -@@ -453,11 +472,11 @@ perl_init() - char *bootargs[] = { "VI", NULL }; - int argc = 3; - static char *argv[] = { "", "-e", "" }; - - #if (PERL_REVISION == 5) && (PERL_VERSION >= 10) -- Perl_sys_init3(&argc, (char***)&argv, NULL); -+ Perl_sys_init(&argc, (char***)&argv); - #endif - perl_interp = perl_alloc(); - perl_construct(perl_interp); - perl_parse(perl_interp, xs_init, argc, argv, 0); - perl_call_argv("VIM::bootstrap", (long)G_DISCARD, bootargs); -@@ -713,13 +732,16 @@ ex_perl(eap) - } - - #ifdef HAVE_SANDBOX - if (sandbox) - { -- if ((safe = perl_get_sv( "VIM::safe", FALSE )) == NULL || !SvTRUE(safe)) -+ safe = perl_get_sv( "VIM::safe", FALSE ); -+# ifndef MAKE_TEST /* avoid a warning for unreachable code */ -+ if (safe == NULL || !SvTRUE(safe)) - EMSG(_("E299: Perl evaluation forbidden in sandbox without the Safe module")); - else -+# endif - { - PUSHMARK(SP); - XPUSHs(safe); - XPUSHs(sv); - PUTBACK; -@@ -1226,13 +1248,12 @@ Delete(vimbuf, ...) - aucmd_prepbuf(&aco, vimbuf); - - if (u_savedel(lnum, 1) == OK) - { - ml_delete(lnum, 0); -+ check_cursor(); - deleted_lines_mark(lnum, 1L); -- if (aco.save_buf == curbuf) -- check_cursor(); - } - - /* restore curwin/curbuf and a few other things */ - aucmd_restbuf(&aco); - /* Careful: autocommands may have made "vimbuf" invalid! */ ---- vim72.orig/src/if_python.c -+++ vim72/src/if_python.c -@@ -35,10 +35,16 @@ - #endif - - #ifdef HAVE_STDARG_H - # undef HAVE_STDARG_H /* Python's config.h defines it as well. */ - #endif -+#ifdef _POSIX_C_SOURCE -+# undef _POSIX_C_SOURCE /* pyconfig.h defines it as well. */ -+#endif -+#ifdef _XOPEN_SOURCE -+# undef _XOPEN_SOURCE /* pyconfig.h defines it as well. */ -+#endif - - #define PY_SSIZE_T_CLEAN - - #include <Python.h> - #if defined(MACOS) && !defined(MACOS_X_UNIX) -@@ -529,10 +535,16 @@ Python_Init(void) - goto fail; - - if (PythonMod_Init()) - goto fail; - -+ /* Remove the element from sys.path that was added because of our -+ * argv[0] value in PythonMod_Init(). Previously we used an empty -+ * string, but dependinding on the OS we then get an empty entry or -+ * the current directory in sys.path. */ -+ PyRun_SimpleString("import sys; sys.path = filter(lambda x: x != '/must>not&exist', sys.path)"); -+ - /* the first python thread is vim's, release the lock */ - Python_SaveThread(); - - initialised = 1; - } -@@ -1088,13 +1100,12 @@ static struct PyMethodDef VimMethods[] = - { NULL, NULL, 0, NULL } - }; - - /* Vim module - Implementation - */ --/*ARGSUSED*/ - static PyObject * --VimCommand(PyObject *self, PyObject *args) -+VimCommand(PyObject *self UNUSED, PyObject *args) - { - char *cmd; - PyObject *result; - - if (!PyArg_ParseTuple(args, "s", &cmd)) -@@ -1143,48 +1154,56 @@ VimToPython(typval_T *our_tv, int depth, - return result; - } - - /* Check if we run into a recursive loop. The item must be in lookupDict - * then and we can use it again. */ -- sprintf(ptrBuf, PRINTF_DECIMAL_LONG_U, (long_u)our_tv); -- result = PyDict_GetItemString(lookupDict, ptrBuf); -- if (result != NULL) -- Py_INCREF(result); -- else if (our_tv->v_type == VAR_STRING) -+ if ((our_tv->v_type == VAR_LIST && our_tv->vval.v_list != NULL) -+ || (our_tv->v_type == VAR_DICT && our_tv->vval.v_dict != NULL)) -+ { -+ sprintf(ptrBuf, PRINTF_DECIMAL_LONG_U, -+ our_tv->v_type == VAR_LIST ? (long_u)our_tv->vval.v_list -+ : (long_u)our_tv->vval.v_dict); -+ result = PyDict_GetItemString(lookupDict, ptrBuf); -+ if (result != NULL) -+ { -+ Py_INCREF(result); -+ return result; -+ } -+ } -+ -+ if (our_tv->v_type == VAR_STRING) - { - result = Py_BuildValue("s", our_tv->vval.v_string); -- PyDict_SetItemString(lookupDict, ptrBuf, result); - } - else if (our_tv->v_type == VAR_NUMBER) - { - char buf[NUMBUFLEN]; - - /* For backwards compatibility numbers are stored as strings. */ - sprintf(buf, "%ld", (long)our_tv->vval.v_number); - result = Py_BuildValue("s", buf); -- PyDict_SetItemString(lookupDict, ptrBuf, result); - } - # ifdef FEAT_FLOAT - else if (our_tv->v_type == VAR_FLOAT) - { - char buf[NUMBUFLEN]; - - sprintf(buf, "%f", our_tv->vval.v_float); - result = Py_BuildValue("s", buf); -- PyDict_SetItemString(lookupDict, ptrBuf, result); - } - # endif - else if (our_tv->v_type == VAR_LIST) - { - list_T *list = our_tv->vval.v_list; - listitem_T *curr; - - result = PyList_New(0); -- PyDict_SetItemString(lookupDict, ptrBuf, result); - - if (list != NULL) - { -+ PyDict_SetItemString(lookupDict, ptrBuf, result); -+ - for (curr = list->lv_first; curr != NULL; curr = curr->li_next) - { - newObj = VimToPython(&curr->li_tv, depth + 1, lookupDict); - PyList_Append(result, newObj); - Py_DECREF(newObj); -@@ -1192,19 +1211,20 @@ VimToPython(typval_T *our_tv, int depth, - } - } - else if (our_tv->v_type == VAR_DICT) - { - result = PyDict_New(); -- PyDict_SetItemString(lookupDict, ptrBuf, result); - - if (our_tv->vval.v_dict != NULL) - { - hashtab_T *ht = &our_tv->vval.v_dict->dv_hashtab; - long_u todo = ht->ht_used; - hashitem_T *hi; - dictitem_T *di; - -+ PyDict_SetItemString(lookupDict, ptrBuf, result); -+ - for (hi = ht->ht_array; todo > 0; ++hi) - { - if (!HASHITEM_EMPTY(hi)) - { - --todo; -@@ -1225,13 +1245,12 @@ VimToPython(typval_T *our_tv, int depth, - - return result; - } - #endif - --/*ARGSUSED*/ - static PyObject * --VimEval(PyObject *self, PyObject *args) -+VimEval(PyObject *self UNUSED, PyObject *args) - { - #ifdef FEAT_EVAL - char *expr; - typval_T *our_tv; - PyObject *result; -@@ -1877,13 +1896,12 @@ static PyTypeObject BufListType = { - }; - - /* Buffer list object - Implementation - */ - --/*ARGSUSED*/ - static PyInt --BufListLength(PyObject *self) -+BufListLength(PyObject *self UNUSED) - { - buf_T *b = firstbuf; - PyInt n = 0; - - while (b) -@@ -1893,13 +1911,12 @@ BufListLength(PyObject *self) - } - - return n; - } - --/*ARGSUSED*/ - static PyObject * --BufListItem(PyObject *self, PyInt n) -+BufListItem(PyObject *self UNUSED, PyInt n) - { - buf_T *b; - - for (b = firstbuf; b; b = b->b_next, --n) - { -@@ -2045,10 +2062,11 @@ WindowSetattr(PyObject *self, char *name - } - else if (strcmp(name, "cursor") == 0) - { - long lnum; - long col; -+ long len; - - if (!PyArg_Parse(val, "(ll)", &lnum, &col)) - return -1; - - if (lnum <= 0 || lnum > this->win->w_buffer->b_ml.ml_line_count) -@@ -2059,14 +2077,20 @@ WindowSetattr(PyObject *self, char *name - - /* Check for keyboard interrupts */ - if (VimErrorCheck()) - return -1; - -- /* NO CHECK ON COLUMN - SEEMS NOT TO MATTER */ -+ /* When column is out of range silently correct it. */ -+ len = (long)STRLEN(ml_get_buf(this->win->w_buffer, lnum, FALSE)); -+ if (col > len) -+ col = len; - - this->win->w_cursor.lnum = lnum; - this->win->w_cursor.col = col; -+#ifdef FEAT_VIRTUALEDIT -+ this->win->w_cursor.coladd = 0; -+#endif - update_screen(VALID); - - return 0; - } - else if (strcmp(name, "height") == 0) -@@ -2193,13 +2217,12 @@ static PyTypeObject WinListType = { - (reprfunc) 0, /* tp_str, str(x) */ - }; - - /* Window list object - Implementation - */ --/*ARGSUSED*/ - static PyInt --WinListLength(PyObject *self) -+WinListLength(PyObject *self UNUSED) - { - win_T *w = firstwin; - PyInt n = 0; - - while (w != NULL) -@@ -2209,13 +2232,12 @@ WinListLength(PyObject *self) - } - - return n; - } - --/*ARGSUSED*/ - static PyObject * --WinListItem(PyObject *self, PyInt n) -+WinListItem(PyObject *self UNUSED, PyInt n) - { - win_T *w; - - for (w = firstwin; w != NULL; w = W_NEXT(w), --n) - if (n == 0) -@@ -2257,13 +2279,12 @@ static PyTypeObject CurrentType = { - (reprfunc) 0, /* tp_str, str(x) */ - }; - - /* Current items object - Implementation - */ --/*ARGSUSED*/ - static PyObject * --CurrentGetattr(PyObject *self, char *name) -+CurrentGetattr(PyObject *self UNUSED, char *name) - { - if (strcmp(name, "buffer") == 0) - return (PyObject *)BufferNew(curbuf); - else if (strcmp(name, "window") == 0) - return (PyObject *)WindowNew(curwin); -@@ -2278,13 +2299,12 @@ CurrentGetattr(PyObject *self, char *nam - PyErr_SetString(PyExc_AttributeError, name); - return NULL; - } - } - --/*ARGSUSED*/ - static int --CurrentSetattr(PyObject *self, char *name, PyObject *value) -+CurrentSetattr(PyObject *self UNUSED, char *name, PyObject *value) - { - if (strcmp(name, "line") == 0) - { - if (SetBufferLine(curbuf, (PyInt)curwin->w_cursor.lnum, value, NULL) == FAIL) - return -1; -@@ -2343,11 +2363,12 @@ static CurrentObject TheCurrent = - static int - PythonMod_Init(void) - { - PyObject *mod; - PyObject *dict; -- static char *(argv[2]) = {"", NULL}; -+ /* The special value is removed from sys.path in Python_Init(). */ -+ static char *(argv[2]) = {"/must>not&exist/foo", NULL}; - - /* Fixups... */ - BufferType.ob_type = &PyType_Type; - RangeType.ob_type = &PyType_Type; - WindowType.ob_type = &PyType_Type; -@@ -2487,13 +2508,13 @@ SetBufferLine(buf_T *buf, PyInt n, PyObj - PyErr_SetVim(_("cannot save undo information")); - else if (ml_delete((linenr_T)n, FALSE) == FAIL) - PyErr_SetVim(_("cannot delete line")); - else - { -- deleted_lines_mark((linenr_T)n, 1L); - if (buf == curwin->w_buffer) - py_fix_cursor((linenr_T)n, (linenr_T)n + 1, (linenr_T)-1); -+ deleted_lines_mark((linenr_T)n, 1L); - } - - curbuf = savebuf; - - if (PyErr_Occurred() || VimErrorCheck()) -@@ -2586,14 +2607,13 @@ SetBufferLineList(buf_T *buf, PyInt lo, - { - PyErr_SetVim(_("cannot delete line")); - break; - } - } -- deleted_lines_mark((linenr_T)lo, (long)i); -- - if (buf == curwin->w_buffer) - py_fix_cursor((linenr_T)lo, (linenr_T)hi, (linenr_T)-n); -+ deleted_lines_mark((linenr_T)lo, (long)i); - } - - curbuf = savebuf; - - if (PyErr_Occurred() || VimErrorCheck()) ---- vim72.orig/src/if_ruby.c -+++ vim72/src/if_ruby.c -@@ -37,20 +37,40 @@ - # define rb_cNilClass (*dll_rb_cNilClass) - # define rb_cSymbol (*dll_rb_cSymbol) - # define rb_cTrueClass (*dll_rb_cTrueClass) - # if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18 - /* -- * On ver 1.8, all Ruby functions are exported with "__declspce(dllimport)" -- * in ruby.h. But it cause trouble for these variables, because it is -+ * On ver 1.8, all Ruby functions are exported with "__declspec(dllimport)" -+ * in ruby.h. But it causes trouble for these variables, because it is - * defined in this file. When defined this RUBY_EXPORT it modified to - * "extern" and be able to avoid this problem. - */ - # define RUBY_EXPORT - # endif - #endif - -+/* suggested by Ariya Mizutani */ -+#if (_MSC_VER == 1200) -+# undef _WIN32_WINNT -+#endif -+ -+#if (defined(RUBY_VERSION) && RUBY_VERSION >= 19) \ -+ || (defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19) -+# define RUBY19_OR_LATER 1 -+#endif -+ -+#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19 -+/* Ruby 1.9 defines a number of static functions which use rb_num2long and -+ * rb_int2big */ -+# define rb_num2long rb_num2long_stub -+# define rb_int2big rb_int2big_stub -+#endif -+ - #include <ruby.h> -+#ifdef RUBY19_OR_LATER -+# include <ruby/encoding.h> -+#endif - - #undef EXTERN - #undef _ - - /* T_DATA defined both by Ruby and Mac header files, hack around it... */ -@@ -58,10 +78,32 @@ - # define __OPENTRANSPORT__ - # define __OPENTRANSPORTPROTOCOL__ - # define __OPENTRANSPORTPROVIDERS__ - #endif - -+/* -+ * Backward compatiblity for Ruby 1.8 and earlier. -+ * Ruby 1.9 does not provide STR2CSTR, instead StringValuePtr is provided. -+ * Ruby 1.9 does not provide RXXX(s)->len and RXXX(s)->ptr, instead -+ * RXXX_LEN(s) and RXXX_PTR(s) are provided. -+ */ -+#ifndef StringValuePtr -+# define StringValuePtr(s) STR2CSTR(s) -+#endif -+#ifndef RARRAY_LEN -+# define RARRAY_LEN(s) RARRAY(s)->len -+#endif -+#ifndef RARRAY_PTR -+# define RARRAY_PTR(s) RARRAY(s)->ptr -+#endif -+#ifndef RSTRING_LEN -+# define RSTRING_LEN(s) RSTRING(s)->len -+#endif -+#ifndef RSTRING_PTR -+# define RSTRING_PTR(s) RSTRING(s)->ptr -+#endif -+ - #include "vim.h" - #include "version.h" - - #if defined(PROTO) && !defined(FEAT_RUBY) - /* Define these to be able to generate the function prototypes. */ -@@ -127,17 +169,37 @@ static void ruby_vim_init(void); - #define rb_str2cstr dll_rb_str2cstr - #define rb_str_cat dll_rb_str_cat - #define rb_str_concat dll_rb_str_concat - #define rb_str_new dll_rb_str_new - #define rb_str_new2 dll_rb_str_new2 --#define ruby_errinfo (*dll_ruby_errinfo) -+#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18 -+# define rb_string_value_ptr dll_rb_string_value_ptr -+# define rb_float_new dll_rb_float_new -+# define rb_ary_new dll_rb_ary_new -+# define rb_ary_push dll_rb_ary_push -+#endif -+#ifdef RUBY19_OR_LATER -+# define rb_errinfo dll_rb_errinfo -+#else -+# define ruby_errinfo (*dll_ruby_errinfo) -+#endif - #define ruby_init dll_ruby_init - #define ruby_init_loadpath dll_ruby_init_loadpath -+#define NtInitialize dll_NtInitialize - #if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18 - # define rb_w32_snprintf dll_rb_w32_snprintf - #endif - -+#ifdef RUBY19_OR_LATER -+# define ruby_script dll_ruby_script -+# define rb_enc_find_index dll_rb_enc_find_index -+# define rb_enc_find dll_rb_enc_find -+# define rb_enc_str_new dll_rb_enc_str_new -+# define rb_sprintf dll_rb_sprintf -+# define ruby_init_stack dll_ruby_init_stack -+#endif -+ - /* - * Pointers for dynamic link - */ - static VALUE (*dll_rb_assoc_new) (VALUE, VALUE); - static VALUE *dll_rb_cFalseClass; -@@ -181,17 +243,51 @@ static void (*dll_rb_raise) (VALUE, cons - static char *(*dll_rb_str2cstr) (VALUE,int*); - static VALUE (*dll_rb_str_cat) (VALUE, const char*, long); - static VALUE (*dll_rb_str_concat) (VALUE, VALUE); - static VALUE (*dll_rb_str_new) (const char*, long); - static VALUE (*dll_rb_str_new2) (const char*); -+#ifdef RUBY19_OR_LATER -+static VALUE (*dll_rb_errinfo) (void); -+#else - static VALUE *dll_ruby_errinfo; -+#endif - static void (*dll_ruby_init) (void); - static void (*dll_ruby_init_loadpath) (void); -+static void (*dll_NtInitialize) (int*, char***); -+#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18 -+static char * (*dll_rb_string_value_ptr) (volatile VALUE*); -+static VALUE (*dll_rb_float_new) (double); -+static VALUE (*dll_rb_ary_new) (void); -+static VALUE (*dll_rb_ary_push) (VALUE, VALUE); -+#endif -+#ifdef RUBY19_OR_LATER -+static VALUE (*dll_rb_int2big)(SIGNED_VALUE); -+#endif - #if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18 - static int (*dll_rb_w32_snprintf)(char*, size_t, const char*, ...); - #endif - -+#ifdef RUBY19_OR_LATER -+static void (*dll_ruby_script) (const char*); -+static int (*dll_rb_enc_find_index) (const char*); -+static rb_encoding* (*dll_rb_enc_find) (const char*); -+static VALUE (*dll_rb_enc_str_new) (const char*, long, rb_encoding*); -+static VALUE (*dll_rb_sprintf) (const char*, ...); -+static void (*ruby_init_stack)(VALUE*); -+#endif -+ -+#ifdef RUBY19_OR_LATER -+static SIGNED_VALUE rb_num2long_stub(VALUE x) -+{ -+ return dll_rb_num2long(x); -+} -+static VALUE rb_int2big_stub(SIGNED_VALUE x) -+{ -+ return dll_rb_int2big(x); -+} -+#endif -+ - static HINSTANCE hinstRuby = 0; /* Instance of ruby.dll */ - - /* - * Table of name to function pointer of ruby. - */ -@@ -243,16 +339,42 @@ static struct - {"rb_str2cstr", (RUBY_PROC*)&dll_rb_str2cstr}, - {"rb_str_cat", (RUBY_PROC*)&dll_rb_str_cat}, - {"rb_str_concat", (RUBY_PROC*)&dll_rb_str_concat}, - {"rb_str_new", (RUBY_PROC*)&dll_rb_str_new}, - {"rb_str_new2", (RUBY_PROC*)&dll_rb_str_new2}, -+#ifdef RUBY19_OR_LATER -+ {"rb_errinfo", (RUBY_PROC*)&dll_rb_errinfo}, -+#else - {"ruby_errinfo", (RUBY_PROC*)&dll_ruby_errinfo}, -+#endif - {"ruby_init", (RUBY_PROC*)&dll_ruby_init}, - {"ruby_init_loadpath", (RUBY_PROC*)&dll_ruby_init_loadpath}, -+ { -+#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER < 19 -+ "NtInitialize", -+#else -+ "ruby_sysinit", -+#endif -+ (RUBY_PROC*)&dll_NtInitialize}, - #if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18 - {"rb_w32_snprintf", (RUBY_PROC*)&dll_rb_w32_snprintf}, - #endif -+#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18 -+ {"rb_string_value_ptr", (RUBY_PROC*)&dll_rb_string_value_ptr}, -+ {"rb_float_new", (RUBY_PROC*)&dll_rb_float_new}, -+ {"rb_ary_new", (RUBY_PROC*)&dll_rb_ary_new}, -+ {"rb_ary_push", (RUBY_PROC*)&dll_rb_ary_push}, -+#endif -+#ifdef RUBY19_OR_LATER -+ {"rb_int2big", (RUBY_PROC*)&dll_rb_int2big}, -+ {"ruby_script", (RUBY_PROC*)&dll_ruby_script}, -+ {"rb_enc_find_index", (RUBY_PROC*)&dll_rb_enc_find_index}, -+ {"rb_enc_find", (RUBY_PROC*)&dll_rb_enc_find}, -+ {"rb_enc_str_new", (RUBY_PROC*)&dll_rb_enc_str_new}, -+ {"rb_sprintf", (RUBY_PROC*)&dll_rb_sprintf}, -+ {"ruby_init_stack", (RUBY_PROC*)&dll_ruby_init_stack}, -+#endif - {"", NULL}, - }; - - /* - * Free ruby.dll -@@ -338,10 +460,62 @@ void ex_ruby(exarg_T *eap) - error_print(state); - } - vim_free(script); - } - -+/* -+ * In Ruby 1.9 or later, ruby String object has encoding. -+ * conversion buffer string of vim to ruby String object using -+ * VIM encoding option. -+ */ -+ static VALUE -+vim_str2rb_enc_str(const char *s) -+{ -+#ifdef RUBY19_OR_LATER -+ int isnum; -+ long lval; -+ char_u *sval; -+ rb_encoding *enc; -+ -+ isnum = get_option_value((char_u *)"enc", &lval, &sval, 0); -+ if (isnum == 0) -+ { -+ enc = rb_enc_find((char *)sval); -+ vim_free(sval); -+ if (enc) { -+ return rb_enc_str_new(s, strlen(s), enc); -+ } -+ } -+#endif -+ return rb_str_new2(s); -+} -+ -+ static VALUE -+eval_enc_string_protect(const char *str, int *state) -+{ -+#ifdef RUBY19_OR_LATER -+ int isnum; -+ long lval; -+ char_u *sval; -+ rb_encoding *enc; -+ VALUE v; -+ -+ isnum = get_option_value((char_u *)"enc", &lval, &sval, 0); -+ if (isnum == 0) -+ { -+ enc = rb_enc_find((char *)sval); -+ vim_free(sval); -+ if (enc) -+ { -+ v = rb_sprintf("#-*- coding:%s -*-\n%s", rb_enc_name(enc), str); -+ return rb_eval_string_protect(StringValuePtr(v), state); -+ } -+ } -+#endif -+ return rb_eval_string_protect(str, state); -+} -+ - void ex_rubydo(exarg_T *eap) - { - int state; - linenr_T i; - -@@ -350,24 +524,24 @@ void ex_rubydo(exarg_T *eap) - if (u_save(eap->line1 - 1, eap->line2 + 1) != OK) - return; - for (i = eap->line1; i <= eap->line2; i++) { - VALUE line, oldline; - -- line = oldline = rb_str_new2((char *)ml_get(i)); -+ line = oldline = vim_str2rb_enc_str((char *)ml_get(i)); - rb_lastline_set(line); -- rb_eval_string_protect((char *) eap->arg, &state); -+ eval_enc_string_protect((char *) eap->arg, &state); - if (state) { - error_print(state); - break; - } - line = rb_lastline_get(); - if (!NIL_P(line)) { - if (TYPE(line) != T_STRING) { - EMSG(_("E265: $_ must be an instance of String")); - return; - } -- ml_replace(i, (char_u *) STR2CSTR(line), 1); -+ ml_replace(i, (char_u *) StringValuePtr(line), 1); - changed(); - #ifdef SYNTAX_HL - syn_changed(i); /* recompute syntax hl. for this line */ - #endif - } -@@ -412,13 +586,28 @@ static int ensure_ruby_initialized(void) - { - #ifdef DYNAMIC_RUBY - if (ruby_enabled(TRUE)) - { - #endif -+#ifdef _WIN32 -+ /* suggested by Ariya Mizutani */ -+ int argc = 1; -+ char *argv[] = {"gvim.exe"}; -+ NtInitialize(&argc, &argv); -+#endif -+#ifdef RUBY19_OR_LATER -+ RUBY_INIT_STACK; -+#endif - ruby_init(); -+#ifdef RUBY19_OR_LATER -+ ruby_script("vim-ruby"); -+#endif - ruby_init_loadpath(); - ruby_io_init(); -+#ifdef RUBY19_OR_LATER -+ rb_enc_find_index("encdb"); -+#endif - ruby_vim_init(); - ruby_initialized = 1; - #ifdef DYNAMIC_RUBY - } - else -@@ -432,12 +621,15 @@ static int ensure_ruby_initialized(void) - } - - static void error_print(int state) - { - #ifndef DYNAMIC_RUBY -+#if !(defined(RUBY_VERSION) && RUBY_VERSION >= 19) \ -+ && !(defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 19) - RUBYEXTERN VALUE ruby_errinfo; - #endif -+#endif - VALUE eclass; - VALUE einfo; - char buff[BUFSIZ]; - - #define TAG_RETURN 0x1 -@@ -466,22 +658,27 @@ static void error_print(int state) - case TAG_RETRY: - EMSG(_("E271: retry outside of rescue clause")); - break; - case TAG_RAISE: - case TAG_FATAL: -+#ifdef RUBY19_OR_LATER -+ eclass = CLASS_OF(rb_errinfo()); -+ einfo = rb_obj_as_string(rb_errinfo()); -+#else - eclass = CLASS_OF(ruby_errinfo); - einfo = rb_obj_as_string(ruby_errinfo); -- if (eclass == rb_eRuntimeError && RSTRING(einfo)->len == 0) { -+#endif -+ if (eclass == rb_eRuntimeError && RSTRING_LEN(einfo) == 0) { - EMSG(_("E272: unhandled exception")); - } - else { - VALUE epath; - char *p; - - epath = rb_class_path(eclass); - vim_snprintf(buff, BUFSIZ, "%s: %s", -- RSTRING(epath)->ptr, RSTRING(einfo)->ptr); -+ RSTRING_PTR(epath), RSTRING_PTR(einfo)); - p = strchr(buff, '\n'); - if (p) *p = '\0'; - EMSG(buff); - } - break; -@@ -490,50 +687,119 @@ static void error_print(int state) - EMSG(buff); - break; - } - } - --static VALUE vim_message(VALUE self, VALUE str) -+static VALUE vim_message(VALUE self UNUSED, VALUE str) - { - char *buff, *p; - - str = rb_obj_as_string(str); -- buff = ALLOCA_N(char, RSTRING(str)->len); -- strcpy(buff, RSTRING(str)->ptr); -+ buff = ALLOCA_N(char, RSTRING_LEN(str)); -+ strcpy(buff, RSTRING_PTR(str)); - p = strchr(buff, '\n'); - if (p) *p = '\0'; - MSG(buff); - return Qnil; - } - --static VALUE vim_set_option(VALUE self, VALUE str) -+static VALUE vim_set_option(VALUE self UNUSED, VALUE str) - { -- do_set((char_u *)STR2CSTR(str), 0); -+ do_set((char_u *)StringValuePtr(str), 0); - update_screen(NOT_VALID); - return Qnil; - } - --static VALUE vim_command(VALUE self, VALUE str) -+static VALUE vim_command(VALUE self UNUSED, VALUE str) - { -- do_cmdline_cmd((char_u *)STR2CSTR(str)); -+ do_cmdline_cmd((char_u *)StringValuePtr(str)); - return Qnil; - } - --static VALUE vim_evaluate(VALUE self, VALUE str) --{ - #ifdef FEAT_EVAL -- char_u *value = eval_to_string((char_u *)STR2CSTR(str), NULL, TRUE); -+static VALUE vim_to_ruby(typval_T *tv) -+{ -+ VALUE result = Qnil; - -- if (value != NULL) -+ if (tv->v_type == VAR_STRING) - { -- VALUE val = rb_str_new2((char *)value); -- vim_free(value); -- return val; -+ result = rb_str_new2(tv->vval.v_string == NULL -+ ? "" : (char *)(tv->vval.v_string)); - } -- else -+ else if (tv->v_type == VAR_NUMBER) -+ { -+ result = INT2NUM(tv->vval.v_number); -+ } -+# ifdef FEAT_FLOAT -+ else if (tv->v_type == VAR_FLOAT) -+ { -+ result = rb_float_new(tv->vval.v_float); -+ } -+# endif -+ else if (tv->v_type == VAR_LIST) -+ { -+ list_T *list = tv->vval.v_list; -+ listitem_T *curr; -+ -+ result = rb_ary_new(); -+ -+ if (list != NULL) -+ { -+ for (curr = list->lv_first; curr != NULL; curr = curr->li_next) -+ { -+ rb_ary_push(result, vim_to_ruby(&curr->li_tv)); -+ } -+ } -+ } -+ else if (tv->v_type == VAR_DICT) -+ { -+ result = rb_hash_new(); -+ -+ if (tv->vval.v_dict != NULL) -+ { -+ hashtab_T *ht = &tv->vval.v_dict->dv_hashtab; -+ long_u todo = ht->ht_used; -+ hashitem_T *hi; -+ dictitem_T *di; -+ -+ for (hi = ht->ht_array; todo > 0; ++hi) -+ { -+ if (!HASHITEM_EMPTY(hi)) -+ { -+ --todo; -+ -+ di = dict_lookup(hi); -+ rb_hash_aset(result, rb_str_new2((char *)hi->hi_key), -+ vim_to_ruby(&di->di_tv)); -+ } -+ } -+ } -+ } /* else return Qnil; */ -+ -+ return result; -+} - #endif -+ -+static VALUE vim_evaluate(VALUE self UNUSED, VALUE str) -+{ -+#ifdef FEAT_EVAL -+ typval_T *tv; -+ VALUE result; -+ -+ tv = eval_expr((char_u *)StringValuePtr(str), NULL); -+ if (tv == NULL) -+ { - return Qnil; -+ } -+ result = vim_to_ruby(tv); -+ -+ free_tv(tv); -+ -+ return result; -+#else -+ return Qnil; -+#endif - } - - static VALUE buffer_new(buf_T *buf) - { - if (buf->b_ruby_ref) -@@ -578,11 +844,11 @@ static VALUE buffer_s_count() - } - - return INT2NUM(n); - } - --static VALUE buffer_s_aref(VALUE self, VALUE num) -+static VALUE buffer_s_aref(VALUE self UNUSED, VALUE num) - { - buf_T *b; - int n = NUM2INT(num); - - for (b = firstbuf; b != NULL; b = b->b_next) -@@ -624,14 +890,16 @@ static VALUE buffer_count(VALUE self) - static VALUE get_buffer_line(buf_T *buf, linenr_T n) - { - if (n > 0 && n <= buf->b_ml.ml_line_count) - { - char *line = (char *)ml_get_buf(buf, n, FALSE); -- return line ? rb_str_new2(line) : Qnil; -+ return line ? vim_str2rb_enc_str(line) : Qnil; - } -- rb_raise(rb_eIndexError, "index %d out of buffer", n); -+ rb_raise(rb_eIndexError, "line number %ld out of range", (long)n); -+#ifndef __GNUC__ - return Qnil; /* For stop warning */ -+#endif - } - - static VALUE buffer_aref(VALUE self, VALUE num) - { - buf_T *buf = get_buf(self); -@@ -641,11 +909,11 @@ static VALUE buffer_aref(VALUE self, VAL - return Qnil; /* For stop warning */ - } - - static VALUE set_buffer_line(buf_T *buf, linenr_T n, VALUE str) - { -- char *line = STR2CSTR(str); -+ char *line = StringValuePtr(str); - aco_save_T aco; - - if (n > 0 && n <= buf->b_ml.ml_line_count && line != NULL) - { - /* set curwin/curbuf for "buf" and save some things */ -@@ -665,12 +933,14 @@ static VALUE set_buffer_line(buf_T *buf, - - update_curbuf(NOT_VALID); - } - else - { -- rb_raise(rb_eIndexError, "index %d out of buffer", n); -+ rb_raise(rb_eIndexError, "line number %ld out of range", (long)n); -+#ifndef __GNUC__ - return Qnil; /* For stop warning */ -+#endif - } - return str; - } - - static VALUE buffer_aset(VALUE self, VALUE num, VALUE str) -@@ -709,23 +979,26 @@ static VALUE buffer_delete(VALUE self, V - - update_curbuf(NOT_VALID); - } - else - { -- rb_raise(rb_eIndexError, "index %d out of buffer", n); -+ rb_raise(rb_eIndexError, "line number %ld out of range", n); - } - return Qnil; - } - - static VALUE buffer_append(VALUE self, VALUE num, VALUE str) - { - buf_T *buf = get_buf(self); -- char *line = STR2CSTR(str); -+ char *line = StringValuePtr(str); - long n = NUM2LONG(num); - aco_save_T aco; - -- if (n >= 0 && n <= buf->b_ml.ml_line_count && line != NULL) -+ if (line == NULL) { -+ rb_raise(rb_eIndexError, "NULL line"); -+ } -+ else if (n >= 0 && n <= buf->b_ml.ml_line_count) - { - /* set curwin/curbuf for "buf" and save some things */ - aucmd_prepbuf(&aco, buf); - - if (u_inssub(n + 1) == OK) { -@@ -743,11 +1016,11 @@ static VALUE buffer_append(VALUE self, V - /* Careful: autocommands may have made "buf" invalid! */ - - update_curbuf(NOT_VALID); - } - else { -- rb_raise(rb_eIndexError, "index %d out of buffer", n); -+ rb_raise(rb_eIndexError, "line number %ld out of range", n); - } - return str; - } - - static VALUE window_new(win_T *win) -@@ -787,11 +1060,11 @@ static VALUE window_s_current() - static VALUE line_s_current() - { - return get_buffer_line(curbuf, curwin->w_cursor.lnum); - } - --static VALUE set_current_line(VALUE self, VALUE str) -+static VALUE set_current_line(VALUE self UNUSED, VALUE str) - { - return set_buffer_line(curbuf, curwin->w_cursor.lnum, str); - } - - static VALUE current_line_number() -@@ -813,11 +1086,11 @@ static VALUE window_s_count() - #else - return INT2NUM(1); - #endif - } - --static VALUE window_s_aref(VALUE self, VALUE num) -+static VALUE window_s_aref(VALUE self UNUSED, VALUE num) - { - win_T *w; - int n = NUM2INT(num); - - #ifndef FEAT_WINDOWS -@@ -884,31 +1157,31 @@ static VALUE window_set_cursor(VALUE sel - { - VALUE lnum, col; - win_T *win = get_win(self); - - Check_Type(pos, T_ARRAY); -- if (RARRAY(pos)->len != 2) -+ if (RARRAY_LEN(pos) != 2) - rb_raise(rb_eArgError, "array length must be 2"); -- lnum = RARRAY(pos)->ptr[0]; -- col = RARRAY(pos)->ptr[1]; -+ lnum = RARRAY_PTR(pos)[0]; -+ col = RARRAY_PTR(pos)[1]; - win->w_cursor.lnum = NUM2LONG(lnum); - win->w_cursor.col = NUM2UINT(col); - check_cursor(); /* put cursor on an existing line */ - update_screen(NOT_VALID); - return Qnil; - } - --static VALUE f_p(int argc, VALUE *argv, VALUE self) -+static VALUE f_p(int argc, VALUE *argv, VALUE self UNUSED) - { - int i; - VALUE str = rb_str_new("", 0); - - for (i = 0; i < argc; i++) { - if (i > 0) rb_str_cat(str, ", ", 2); - rb_str_concat(str, rb_inspect(argv[i])); - } -- MSG(RSTRING(str)->ptr); -+ MSG(RSTRING_PTR(str)); - return Qnil; - } - - static void ruby_io_init(void) - { ---- vim72.orig/src/if_sniff.c -+++ vim72/src/if_sniff.c -@@ -714,12 +714,14 @@ ConnectToSniffEmacs() - } - - #else /* UNIX Version of the Code */ - int ToSniffEmacs[2], FromSniffEmacs[2]; - -- pipe(ToSniffEmacs); -- pipe(FromSniffEmacs); -+ if (pipe(ToSniffEmacs) != 0) -+ return 1; -+ if (pipe(FromSniffEmacs) != 0) -+ return 1; - - /* fork */ - if ((sniffemacs_pid=fork()) == 0) - { - /* child */ -@@ -1112,11 +1114,12 @@ vi_error_msg(str) - static void - vi_open_file(fname) - char *fname; - { - ++no_wait_return; -- do_ecmd(0, (char_u *)fname, NULL, NULL, ECMD_ONE, ECMD_HIDE+ECMD_OLDBUF); -+ do_ecmd(0, (char_u *)fname, NULL, NULL, ECMD_ONE, ECMD_HIDE+ECMD_OLDBUF, -+ curwin); - curbuf->b_sniff = TRUE; - --no_wait_return; /* [ex_docmd.c] */ - } - - static buf_T * ---- vim72.orig/src/if_tcl.c -+++ vim72/src/if_tcl.c -@@ -159,11 +159,11 @@ static struct ref refsdeleted; /* dummy - # ifndef DYNAMIC_TCL /* Just generating prototypes */ - typedef int HANDLE; - # endif - - /* -- * Declare HANDLE for perl.dll and function pointers. -+ * Declare HANDLE for tcl.dll and function pointers. - */ - static HANDLE hTclLib = NULL; - Tcl_Interp* (*dll_Tcl_CreateInterp)(); - - /* -@@ -180,11 +180,11 @@ static struct { - - /* - * Make all runtime-links of tcl. - * - * 1. Get module handle using LoadLibraryEx. -- * 2. Get pointer to perl function by GetProcAddress. -+ * 2. Get pointer to tcl function by GetProcAddress. - * 3. Repeat 2, until get all functions will be used. - * - * Parameter 'libname' provides name of DLL. - * Return OK or FAIL. - */ -@@ -288,14 +288,13 @@ tcl_end() - * we just delete the Tcl interpreter (and create a new one with the next - * :tcl command). - */ - #define TCL_EXIT 5 - --/* ARGSUSED */ - static int - exitcmd(dummy, interp, objc, objv) -- ClientData dummy; -+ ClientData dummy UNUSED; - Tcl_Interp *interp; - int objc; - Tcl_Obj *CONST objv[]; - { - int value = 0; -@@ -313,14 +312,13 @@ exitcmd(dummy, interp, objc, objv) - Tcl_WrongNumArgs(interp, 1, objv, "?returnCode?"); - } - return TCL_ERROR; - } - --/* ARGSUSED */ - static int - catchcmd(dummy, interp, objc, objv) -- ClientData dummy; -+ ClientData dummy UNUSED; - Tcl_Interp *interp; - int objc; - Tcl_Obj *CONST objv[]; - { - char *varname = NULL; -@@ -354,14 +352,13 @@ catchcmd(dummy, interp, objc, objv) - } - - /* - * "::vim::beep" - what Vi[m] does best :-) - */ --/* ARGSUSED */ - static int - beepcmd(dummy, interp, objc, objv) -- ClientData dummy; -+ ClientData dummy UNUSED; - Tcl_Interp *interp; - int objc; - Tcl_Obj *CONST objv[]; - { - if (objc != 1) -@@ -376,14 +373,13 @@ beepcmd(dummy, interp, objc, objv) - /* - * "::vim::buffer list" - create a list of buffer commands. - * "::vim::buffer {N}" - create buffer command for buffer N. - * "::vim::buffer new" - create a new buffer (not implemented) - */ --/* ARGSUSED */ - static int - buffercmd(dummy, interp, objc, objv) -- ClientData dummy; -+ ClientData dummy UNUSED; - Tcl_Interp *interp; - int objc; - Tcl_Obj *CONST objv[]; - { - char *name; -@@ -473,14 +469,13 @@ buffercmd(dummy, interp, objc, objv) - } - - /* - * "::vim::window list" - create list of window commands. - */ --/* ARGSUSED */ - static int - windowcmd(dummy, interp, objc, objv) -- ClientData dummy; -+ ClientData dummy UNUSED; - Tcl_Interp *interp; - int objc; - Tcl_Obj *CONST objv[]; - { - char *what, *string; -@@ -1128,14 +1123,13 @@ winselfcmd(ref, interp, objc, objv) - - return err; - } - - --/* ARGSUSED */ - static int - commandcmd(dummy, interp, objc, objv) -- ClientData dummy; -+ ClientData dummy UNUSED; - Tcl_Interp *interp; - int objc; - Tcl_Obj *CONST objv[]; - { - int err; -@@ -1143,14 +1137,13 @@ commandcmd(dummy, interp, objc, objv) - err = tcldoexcommand(interp, objc, objv, 1); - update_screen(VALID); - return err; - } - --/* ARGSUSED */ - static int - optioncmd(dummy, interp, objc, objv) -- ClientData dummy; -+ ClientData dummy UNUSED; - Tcl_Interp *interp; - int objc; - Tcl_Obj *CONST objv[]; - { - int err; -@@ -1158,14 +1151,13 @@ optioncmd(dummy, interp, objc, objv) - err = tclsetoption(interp, objc, objv, 1); - update_screen(VALID); - return err; - } - --/* ARGSUSED */ - static int - exprcmd(dummy, interp, objc, objv) -- ClientData dummy; -+ ClientData dummy UNUSED; - Tcl_Interp *interp; - int objc; - Tcl_Obj *CONST objv[]; - { - return tclvimexpr(interp, objc, objv, 1); -@@ -1582,15 +1574,14 @@ tclsetdelcmd(interp, reflist, vimobj, de - - /******************************************* - I/O Channel - ********************************************/ - --/* ARGSUSED */ - static int - channel_close(instance, interp) - ClientData instance; -- Tcl_Interp *interp; -+ Tcl_Interp *interp UNUSED; - { - int err = 0; - - /* currently does nothing */ - -@@ -1600,16 +1591,15 @@ channel_close(instance, interp) - err = EBADF; - } - return err; - } - --/* ARGSUSED */ - static int - channel_input(instance, buf, bufsiz, errptr) -- ClientData instance; -- char *buf; -- int bufsiz; -+ ClientData instance UNUSED; -+ char *buf UNUSED; -+ int bufsiz UNUSED; - int *errptr; - { - - /* input is currently not supported */ - -@@ -1657,43 +1647,56 @@ channel_output(instance, buf, bufsiz, er - } - vim_free(str); - return result; - } - --/* ARGSUSED */ - static void - channel_watch(instance, mask) -- ClientData instance; -- int mask; -+ ClientData instance UNUSED; -+ int mask UNUSED; - { - Tcl_SetErrno(EINVAL); - } - --/* ARGSUSED */ - static int - channel_gethandle(instance, direction, handleptr) -- ClientData instance; -- int direction; -- ClientData *handleptr; -+ ClientData instance UNUSED; -+ int direction UNUSED; -+ ClientData *handleptr UNUSED; - { - Tcl_SetErrno(EINVAL); - return EINVAL; - } - - - static Tcl_ChannelType channel_type = - { -- "vimmessage", -- NULL, /* blockmode */ -- channel_close, -- channel_input, -- channel_output, -- NULL, /* seek */ -- NULL, /* set option */ -- NULL, /* get option */ -- channel_watch, -- channel_gethandle -+ "vimmessage", /* typeName */ -+ NULL, /* version */ -+ channel_close, /* closeProc */ -+ channel_input, /* inputProc */ -+ channel_output, /* outputProc */ -+ NULL, /* seekProc */ -+ NULL, /* setOptionProc */ -+ NULL, /* getOptionProc */ -+ channel_watch, /* watchProc */ -+ channel_gethandle, /* getHandleProc */ -+ NULL, /* close2Proc */ -+ NULL, /* blockModeProc */ -+#ifdef TCL_CHANNEL_VERSION_2 -+ NULL, /* flushProc */ -+ NULL, /* handlerProc */ -+#endif -+#ifdef TCL_CHANNEL_VERSION_3 -+ NULL, /* wideSeekProc */ -+#endif -+#ifdef TCL_CHANNEL_VERSION_4 -+ NULL, /* threadActionProc */ -+#endif -+#ifdef TCL_CHANNEL_VERSION_5 -+ NULL /* truncateProc */ -+#endif - }; - - /********************************** - Interface to vim - **********************************/ ---- vim72.orig/src/if_xcmdsrv.c -+++ vim72/src/if_xcmdsrv.c -@@ -19,25 +19,10 @@ - # ifdef FEAT_X11 - # include <X11/Intrinsic.h> - # include <X11/Xatom.h> - # endif - --# if defined(HAVE_SYS_SELECT_H) && \ -- (!defined(HAVE_SYS_TIME_H) || defined(SYS_SELECT_WITH_SYS_TIME)) --# include <sys/select.h> --# endif -- --# ifndef HAVE_SELECT --# ifdef HAVE_SYS_POLL_H --# include <sys/poll.h> --# else --# ifdef HAVE_POLL_H --# include <poll.h> --# endif --# endif --# endif -- - /* - * This file provides procedures that implement the command server - * functionality of Vim when in contact with an X11 server. - * - * Adapted from TCL/TK's send command in tkSend.c of the tk 3.6 distribution. -@@ -680,11 +665,11 @@ serverGetVimNames(dpy) - - /* - * Scan all of the names out of the property. - */ - ga_init2(&ga, 1, 100); -- for (p = regProp; (p - regProp) < numItems; p++) -+ for (p = regProp; (long_u)(p - regProp) < numItems; p++) - { - entry = p; - while (*p != 0 && !isspace(*p)) - p++; - if (*p != 0) -@@ -734,11 +719,11 @@ ServerReplyFind(w, op) - { - p = ((struct ServerReply *) serverReply.ga_data) - + serverReply.ga_len; - e.id = w; - ga_init2(&e.strings, 1, 100); -- memcpy(p, &e, sizeof(e)); -+ mch_memmove(p, &e, sizeof(e)); - serverReply.ga_len++; - } - } - else if (p != NULL && op == SROP_Delete) - { -@@ -967,11 +952,11 @@ LookupName(dpy, name, delete, loose) - /* - * Scan the property for the desired name. - */ - returnValue = (int_u)None; - entry = NULL; /* Not needed, but eliminates compiler warning. */ -- for (p = regProp; (p - regProp) < numItems; ) -+ for (p = regProp; (long_u)(p - regProp) < numItems; ) - { - entry = p; - while (*p != 0 && !isspace(*p)) - p++; - if (*p != 0 && STRICMP(name, p + 1) == 0) -@@ -984,11 +969,11 @@ LookupName(dpy, name, delete, loose) - p++; - } - - if (loose != NULL && returnValue == (int_u)None && !IsSerialName(name)) - { -- for (p = regProp; (p - regProp) < numItems; ) -+ for (p = regProp; (long_u)(p - regProp) < numItems; ) - { - entry = p; - while (*p != 0 && !isspace(*p)) - p++; - if (*p != 0 && IsSerialName(p + 1) -@@ -1016,11 +1001,11 @@ LookupName(dpy, name, delete, loose) - while (*p != 0) - p++; - p++; - count = numItems - (p - regProp); - if (count > 0) -- memcpy(entry, p, count); -+ mch_memmove(entry, p, count); - XChangeProperty(dpy, RootWindow(dpy, 0), registryProperty, XA_STRING, - 8, PropModeReplace, regProp, - (int)(numItems - (p - entry))); - XSync(dpy, False); - } -@@ -1054,11 +1039,11 @@ DeleteAnyLingerer(dpy, win) - */ - if (GetRegProp(dpy, ®Prop, &numItems, FALSE) == FAIL) - return; - - /* Scan the property for the window id. */ -- for (p = regProp; (p - regProp) < numItems; ) -+ for (p = regProp; (long_u)(p - regProp) < numItems; ) - { - if (*p != 0) - { - sscanf((char *)p, "%x", &wwin); - if ((Window)wwin == win) -@@ -1070,11 +1055,11 @@ DeleteAnyLingerer(dpy, win) - while (*p != 0) - p++; - p++; - lastHalf = numItems - (p - regProp); - if (lastHalf > 0) -- memcpy(entry, p, lastHalf); -+ mch_memmove(entry, p, lastHalf); - numItems = (entry - regProp) + lastHalf; - p = entry; - continue; - } - } -@@ -1194,11 +1179,11 @@ serverEventProc(dpy, eventPtr) - /* - * Several commands and results could arrive in the property at - * one time; each iteration through the outer loop handles a - * single command or result. - */ -- for (p = propInfo; (p - propInfo) < numItems; ) -+ for (p = propInfo; (long_u)(p - propInfo) < numItems; ) - { - /* - * Ignore leading NULs; each command or result starts with a - * NUL so that no matter how badly formed a preceding command - * is, we'll be able to tell that a new command/result is -@@ -1228,11 +1213,11 @@ serverEventProc(dpy, eventPtr) - name = NULL; - resWindow = None; - serial = (char_u *)""; - script = NULL; - enc = NULL; -- while (p - propInfo < numItems && *p == '-') -+ while ((long_u)(p - propInfo) < numItems && *p == '-') - { - switch (p[1]) - { - case 'r': - end = skipwhite(p + 2); -@@ -1331,11 +1316,11 @@ serverEventProc(dpy, eventPtr) - p += 2; - gotSerial = 0; - res = (char_u *)""; - code = 0; - enc = NULL; -- while ((p-propInfo) < numItems && *p == '-') -+ while ((long_u)(p - propInfo) < numItems && *p == '-') - { - switch (p[1]) - { - case 'r': - if (p[2] == ' ') -@@ -1399,11 +1384,11 @@ serverEventProc(dpy, eventPtr) - */ - p += 2; - gotWindow = 0; - str = (char_u *)""; - enc = NULL; -- while ((p-propInfo) < numItems && *p == '-') -+ while ((long_u)(p - propInfo) < numItems && *p == '-') - { - switch (p[1]) - { - case 'n': - if (p[2] == ' ') -@@ -1487,15 +1472,14 @@ AppendPropCarefully(dpy, window, propert - - - /* - * Another X Error handler, just used to check for errors. - */ --/* ARGSUSED */ - static int - x_error_check(dpy, error_event) -- Display *dpy; -- XErrorEvent *error_event; -+ Display *dpy UNUSED; -+ XErrorEvent *error_event UNUSED; - { - got_x_error = TRUE; - return 0; - } - ---- vim72.orig/src/integration.c -+++ vim72/src/integration.c -@@ -76,11 +76,11 @@ - # define NOCATGETS(x) x - #endif - - /* Functions private to this file */ - static void workshop_connection_closed(void); --static void messageFromEserve(XtPointer clientData, int *NOTUSED1, XtInputId *NOTUSED2); -+static void messageFromEserve(XtPointer clientData, int *dum1, XtInputId *dum2); - static void workshop_disconnect(void); - static void workshop_sensitivity(int num, char *table); - static void adjust_sign_name(char *filename); - static void process_menuItem(char *); - static void process_toolbarButton(char *); -@@ -155,13 +155,14 @@ getCommand(void) - return NULL; - } - - } - --/*ARGSUSED*/ - void --messageFromEserve(XtPointer clientData, int *NOTUSED1, XtInputId *NOTUSED2) -+messageFromEserve(XtPointer clientData UNUSED, -+ int *dum1 UNUSED, -+ XtInputId *dum2 UNUSED) - { - char *cmd; /* the 1st word of the command */ - - cmd = getCommand(); - if (cmd == NULL) { -@@ -197,11 +198,11 @@ messageFromEserve(XtPointer clientData, - color++; - } - if (sign) { - sign++; - } -- /* Change sign name to accomodate a different size? */ -+ /* Change sign name to accommodate a different size? */ - adjust_sign_name(sign); - workshop_add_mark_type(idx, color, sign); - } - HANDLE_ERRORS(cmd); - break; -@@ -578,11 +579,11 @@ unrecognised_message( - /* abort(); */ - } - #endif - - --/* Change sign name to accomodate a different size: -+/* Change sign name to accommodate a different size: - * Create the filename based on the height. The filename format - * of multisize icons are: - * x.xpm : largest icon - * x1.xpm : smaller icon - * x2.xpm : smallest icon */ -@@ -612,10 +613,11 @@ adjust_sign_name(char *filename) - strcpy(s, "1.xpm"); - else - strcpy(s, ".xpm"); - } - -+#if 0 - /* Were we invoked by WorkShop? This function can be used early during startup - if you want to do things differently if the editor is started standalone - or in WorkShop mode. For example, in standalone mode you may not want to - add a footer/message area or a sign gutter. */ - int -@@ -625,10 +627,11 @@ workshop_invoked() - if (result == -1) { - result = (getenv(NOCATGETS("SPRO_EDITOR_SOCKET")) != NULL); - } - return result; - } -+#endif - - /* Connect back to eserve */ - void workshop_connect(XtAppContext context) - { - #ifdef INET_SOCKETS -@@ -748,10 +751,11 @@ void workshop_disconnect() - - /* - * Utility functions - */ - -+#if 0 - /* Set icon for the window */ - void - workshop_set_icon(Display *display, Widget shell, char **xpmdata, - int width, int height) - { -@@ -791,10 +795,11 @@ workshop_set_icon(Display *display, Widg - XtVaSetValues(shell, - XtNiconWindow, iconWindow, NULL); - } - XtFree((char *)xpmAttributes.colorsymbols); - } -+#endif - - /* Minimize and maximize shells. From libutil's shell.cc. */ - - /* utility functions from libutil's shell.cc */ - static Boolean -@@ -925,11 +930,11 @@ Boolean workshop_get_width_height(int *w - *height = hgt; - } - return success; - } - -- -+#if 0 - Boolean workshop_get_rows_cols(int *rows, int *cols) - { - static int r = 0; - static int c = 0; - static Boolean firstTime = True; -@@ -956,10 +961,11 @@ Boolean workshop_get_rows_cols(int *rows - *rows = r; - *cols = c; - } - return success; - } -+#endif - - /* - * Toolbar code - */ - -@@ -1041,23 +1047,23 @@ void workshop_set_option_first(char *nam - workshop_set_option(name, value); - } - } - - -- -+#if 0 - /* - * Send information to eserve on certain editor events - * You must make sure these are called when necessary - */ -- - void workshop_file_closed(char *filename) - { - char buffer[2*MAXPATHLEN]; - vim_snprintf(buffer, sizeof(buffer), - NOCATGETS("deletedFile %s\n"), filename); - write(sd, buffer, strlen(buffer)); - } -+#endif - - void workshop_file_closed_lineno(char *filename, int lineno) - { - char buffer[2*MAXPATHLEN]; - vim_snprintf(buffer, sizeof(buffer), -@@ -1084,25 +1090,27 @@ void workshop_file_saved(char *filename) - /* Let editor report any moved marks that the eserve client - * should deal with (for example, moving location-based breakpoints) */ - workshop_moved_marks(filename); - } - --void workshop_move_mark(char *filename, int markId, int newLineno) -+#if 0 -+void workshop_file_modified(char *filename) - { - char buffer[2*MAXPATHLEN]; - vim_snprintf(buffer, sizeof(buffer), -- NOCATGETS("moveMark %s %d %d\n"), filename, markId, newLineno); -+ NOCATGETS("modifiedFile %s\n"), filename); - write(sd, buffer, strlen(buffer)); - } - --void workshop_file_modified(char *filename) -+void workshop_move_mark(char *filename, int markId, int newLineno) - { - char buffer[2*MAXPATHLEN]; - vim_snprintf(buffer, sizeof(buffer), -- NOCATGETS("modifiedFile %s\n"), filename); -+ NOCATGETS("moveMark %s %d %d\n"), filename, markId, newLineno); - write(sd, buffer, strlen(buffer)); - } -+#endif - - void workshop_frame_moved(int new_x, int new_y, int new_w, int new_h) - { - char buffer[200]; - -@@ -1177,14 +1185,16 @@ void workshop_perform_verb(char *verb, v - } - } - } - - /* Send a message to eserve */ -+#if defined(NOHANDS_SUPPORT_FUNCTIONS) || defined(FEAT_BEVAL) - void workshop_send_message(char *buf) - { - write(sd, buf, strlen(buf)); - } -+#endif - - /* Some methods, like currentFile, cursorPos, etc. are missing here. - * But it looks like these are used for NoHands testing only so we - * won't bother requiring editors to implement these - */ ---- vim72.orig/src/macros.h -+++ vim72/src/macros.h -@@ -125,19 +125,35 @@ - #define CHARSIZE(c) (chartab[c] & CT_CELL_MASK) - - #ifdef FEAT_LANGMAP - /* - * Adjust chars in a language according to 'langmap' option. -- * NOTE that there is NO overhead if 'langmap' is not set; but even -- * when set we only have to do 2 ifs and an array lookup. -+ * NOTE that there is no noticeable overhead if 'langmap' is not set. -+ * When set the overhead for characters < 256 is small. - * Don't apply 'langmap' if the character comes from the Stuff buffer. - * The do-while is just to ignore a ';' after the macro. - */ --# define LANGMAP_ADJUST(c, condition) do { \ -- if (*p_langmap && (condition) && !KeyStuffed && (c) >= 0 && (c) < 256) \ -- c = langmap_mapchar[c]; \ -+# ifdef FEAT_MBYTE -+# define LANGMAP_ADJUST(c, condition) \ -+ do { \ -+ if (*p_langmap && (condition) && !KeyStuffed && (c) >= 0) \ -+ { \ -+ if ((c) < 256) \ -+ c = langmap_mapchar[c]; \ -+ else \ -+ c = langmap_adjust_mb(c); \ -+ } \ - } while (0) -+# else -+# define LANGMAP_ADJUST(c, condition) \ -+ do { \ -+ if (*p_langmap && (condition) && !KeyStuffed && (c) >= 0 && (c) < 256) \ -+ c = langmap_mapchar[c]; \ -+ } while (0) -+# endif -+#else -+# define LANGMAP_ADJUST(c, condition) /* nop */ - #endif - - /* - * vim_isbreak() is used very often if 'linebreak' is set, use a macro to make - * it work fast. -@@ -225,11 +241,11 @@ - # define ZDECODE(c) update_keys(c ^= decrypt_byte()) - - #endif - - #ifdef STARTUPTIME --# define TIME_MSG(s) time_msg(s, NULL) -+# define TIME_MSG(s) { if (time_fd != NULL) time_msg(s, NULL); } - #else - # define TIME_MSG(s) - #endif - - #ifdef FEAT_VREPLACE -@@ -266,11 +282,11 @@ - # define mb_ptr_back(s, p) p -= has_mbyte ? ((*mb_head_off)(s, p - 1) + 1) : 1 - /* get length of multi-byte char, not including composing chars */ - # define mb_cptr2len(p) (enc_utf8 ? utf_ptr2len(p) : (*mb_ptr2len)(p)) - - # define MB_COPY_CHAR(f, t) if (has_mbyte) mb_copy_char(&f, &t); else *t++ = *f++ --# define MB_CHARLEN(p) (has_mbyte ? mb_charlen(p) : STRLEN(p)) -+# define MB_CHARLEN(p) (has_mbyte ? mb_charlen(p) : (int)STRLEN(p)) - # define PTR2CHAR(p) (has_mbyte ? mb_ptr2char(p) : (int)*(p)) - #else - # define mb_ptr_adv(p) ++p - # define mb_cptr_adv(p) ++p - # define mb_ptr_back(s, p) --p ---- vim72.orig/src/main.c -+++ vim72/src/main.c -@@ -128,14 +128,10 @@ static void prepare_server __ARGS((mparm - static void cmdsrv_main __ARGS((int *argc, char **argv, char_u *serverName_arg, char_u **serverStr)); - static char_u *serverMakeName __ARGS((char_u *arg, char *cmd)); - #endif - - --#ifdef STARTUPTIME --static FILE *time_fd = NULL; --#endif -- - /* - * Different types of error messages. - */ - static char *(main_errors[]) = - { -@@ -171,10 +167,13 @@ main - char **argv; - { - char_u *fname = NULL; /* file name from command line */ - mparm_T params; /* various parameters passed between - * main() and other functions. */ -+#ifdef STARTUPTIME -+ int i; -+#endif - - /* - * Do any system-specific initialisations. These can NOT use IObuff or - * NameBuff. Thus emsg2() cannot be called! - */ -@@ -201,12 +200,19 @@ main - #ifdef MEM_PROFILE - atexit(vim_mem_profile_dump); - #endif - - #ifdef STARTUPTIME -- time_fd = mch_fopen(STARTUPTIME, "a"); -- TIME_MSG("--- VIM STARTING ---"); -+ for (i = 1; i < argc; ++i) -+ { -+ if (STRICMP(argv[i], "--startuptime") == 0 && i + 1 < argc) -+ { -+ time_fd = mch_fopen(argv[i + 1], "a"); -+ TIME_MSG("--- VIM STARTING ---"); -+ break; -+ } -+ } - #endif - starttime = time(NULL); - - #ifdef __EMX__ - _wildcard(¶ms.argc, ¶ms.argv); -@@ -358,18 +364,25 @@ main - # if defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK) - /* - * Check if the GUI can be started. Reset gui.starting if not. - * Don't know about other systems, stay on the safe side and don't check. - */ -- if (gui.starting && gui_init_check() == FAIL) -+ if (gui.starting) - { -- gui.starting = FALSE; -+ if (gui_init_check() == FAIL) -+ { -+ gui.starting = FALSE; - -- /* When running "evim" or "gvim -y" we need the menus, exit if we -- * don't have them. */ -- if (params.evim_mode) -- mch_exit(1); -+ /* When running "evim" or "gvim -y" we need the menus, exit if we -+ * don't have them. */ -+ if (params.evim_mode) -+ mch_exit(1); -+ } -+# if defined(HAVE_LOCALE_H) || defined(X_LOCALE) -+ /* Re-initialize locale, it may have been altered by gui_init_check() */ -+ init_locale(); -+# endif - } - # endif - #endif - - if (GARGCOUNT > 0) -@@ -643,15 +656,16 @@ main - init_SPAWNO("", SWAP_ANY); - #endif - - #ifdef FEAT_VIMINFO - /* -- * Read in registers, history etc, but not marks, from the viminfo file -+ * Read in registers, history etc, but not marks, from the viminfo file. -+ * This is where v:oldfiles gets filled. - */ - if (*p_viminfo != NUL) - { -- read_viminfo(NULL, TRUE, FALSE, FALSE); -+ read_viminfo(NULL, VIF_WANT_INFO | VIF_GET_OLDFILES); - TIME_MSG("reading viminfo"); - } - #endif - - #ifdef FEAT_QUICKFIX -@@ -932,12 +946,18 @@ main - - TIME_MSG("before starting main loop"); - - /* - * Call the main command loop. This never returns. -+ * For embedded MzScheme the main_loop will be called by Scheme -+ * for proper stack tracking - */ -+#ifndef FEAT_MZSCHEME - main_loop(FALSE, FALSE); -+#else -+ mzscheme_main(); -+#endif - - return 0; - } - #endif /* PROTO */ - -@@ -1141,10 +1161,22 @@ main_loop(cmdwin, noexmode) - - setcursor(); - cursor_on(); - - do_redraw = FALSE; -+ -+#ifdef STARTUPTIME -+ /* Now that we have drawn the first screen all the startup stuff -+ * has been done, close any file for startup messages. */ -+ if (time_fd != NULL) -+ { -+ TIME_MSG("first screen update"); -+ TIME_MSG("--- VIM STARTED ---"); -+ fclose(time_fd); -+ time_fd = NULL; -+ } -+#endif - } - #ifdef FEAT_GUI - if (need_mouse_correct) - gui_mouse_correct(); - #endif -@@ -1455,11 +1487,12 @@ parse_command_name(parmp) - #endif - parmp->evim_mode = TRUE; - ++initstr; - } - -- if (TOLOWER_ASC(initstr[0]) == 'g' || initstr[0] == 'k') -+ /* "gvim" starts the GUI. Also accept "Gvim" for MS-Windows. */ -+ if (TOLOWER_ASC(initstr[0]) == 'g') - { - main_start_gui(); - #ifdef FEAT_GUI - ++initstr; - #endif -@@ -1501,16 +1534,16 @@ parse_command_name(parmp) - * Get the name of the display, before gui_prepare() removes it from - * argv[]. Used for the xterm-clipboard display. - * - * Also find the --server... arguments and --socketid and --windowid - */ --/*ARGSUSED*/ - static void - early_arg_scan(parmp) -- mparm_T *parmp; -+ mparm_T *parmp UNUSED; - { --#if defined(FEAT_XCLIPBOARD) || defined(FEAT_CLIENTSERVER) -+#if defined(FEAT_XCLIPBOARD) || defined(FEAT_CLIENTSERVER) \ -+ || !defined(FEAT_NETBEANS_INTG) - int argc = parmp->argc; - char **argv = parmp->argv; - int i; - - for (i = 1; i < argc; i++) -@@ -1578,10 +1611,18 @@ early_arg_scan(parmp) - # endif - # ifdef FEAT_GUI_GTK - else if (STRICMP(argv[i], "--echo-wid") == 0) - echo_wid_arg = TRUE; - # endif -+# ifndef FEAT_NETBEANS_INTG -+ else if (strncmp(argv[i], "-nb", (size_t)3) == 0) -+ { -+ mch_errmsg(_("'-nb' cannot be used: not enabled at compile time\n")); -+ mch_exit(2); -+ } -+# endif -+ - } - #endif - } - - /* -@@ -1690,10 +1731,15 @@ command_line_scan(parmp) - else if (STRNICMP(argv[0] + argv_idx, "cmd", 3) == 0) - { - want_argument = TRUE; - argv_idx += 3; - } -+ else if (STRNICMP(argv[0] + argv_idx, "startuptime", 11) == 0) -+ { -+ want_argument = TRUE; -+ argv_idx += 11; -+ } - #ifdef FEAT_CLIENTSERVER - else if (STRNICMP(argv[0] + argv_idx, "serverlist", 10) == 0) - ; /* already processed -- no arg */ - else if (STRNICMP(argv[0] + argv_idx, "servername", 10) == 0 - || STRNICMP(argv[0] + argv_idx, "serversend", 10) == 0) -@@ -2021,11 +2067,11 @@ command_line_scan(parmp) - */ - if (argv[0][argv_idx] != NUL) - mainerr(ME_GARBAGE, (char_u *)argv[0]); - - --argc; -- if (argc < 1 && c != 'S') -+ if (argc < 1 && c != 'S') /* -S has an optional argument */ - mainerr_arg_missing((char_u *)argv[0]); - ++argv; - argv_idx = -1; - - switch (c) -@@ -2062,15 +2108,20 @@ command_line_scan(parmp) - else - parmp->commands[parmp->n_commands++] = - (char_u *)argv[0]; - break; - -- case '-': /* "--cmd {command}" execute command */ -- if (parmp->n_pre_commands >= MAX_ARG_CMDS) -- mainerr(ME_EXTRA_CMD, NULL); -- parmp->pre_commands[parmp->n_pre_commands++] = -+ case '-': -+ if (argv[-1][2] == 'c') -+ { -+ /* "--cmd {command}" execute command */ -+ if (parmp->n_pre_commands >= MAX_ARG_CMDS) -+ mainerr(ME_EXTRA_CMD, NULL); -+ parmp->pre_commands[parmp->n_pre_commands++] = - (char_u *)argv[0]; -+ } -+ /* "--startuptime <file>" already handled */ - break; - - /* case 'd': -d {device} is handled in mch_check_win() for the - * Amiga */ - -@@ -2359,22 +2410,21 @@ read_stdin() - * Close stdin and dup it from stderr. Required for GPM to work - * properly, and for running external commands. - * Is there any other system that cannot do this? - */ - close(0); -- dup(2); -+ ignored = dup(2); - #endif - } - - /* - * Create the requested number of windows and edit buffers in them. - * Also does recovery if "recoverymode" set. - */ --/*ARGSUSED*/ - static void - create_windows(parmp) -- mparm_T *parmp; -+ mparm_T *parmp UNUSED; - { - #ifdef FEAT_WINDOWS - int dorewind; - int done = 0; - -@@ -2584,11 +2634,11 @@ edit_buffers(parmp) - # ifdef HAS_SWAP_EXISTS_ACTION - swap_exists_did_quit = FALSE; - # endif - (void)do_ecmd(0, arg_idx < GARGCOUNT - ? alist_name(&GARGLIST[arg_idx]) : NULL, -- NULL, NULL, ECMD_LASTL, ECMD_HIDE); -+ NULL, NULL, ECMD_LASTL, ECMD_HIDE, curwin); - # ifdef HAS_SWAP_EXISTS_ACTION - if (swap_exists_did_quit) - { - /* abort or quit selected */ - if (got_int || only_one_window()) -@@ -3105,10 +3155,13 @@ usage() - main_msg(_("--remote-send <keys>\tSend <keys> to a Vim server and exit")); - main_msg(_("--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result")); - main_msg(_("--serverlist\t\tList available Vim server names and exit")); - main_msg(_("--servername <name>\tSend to/become the Vim server <name>")); - #endif -+#ifdef STARTUPTIME -+ main_msg(_("--startuptime <file>\tWrite startup timing messages to <file>")); -+#endif - #ifdef FEAT_VIMINFO - main_msg(_("-i <viminfo>\t\tUse <viminfo> instead of .viminfo")); - #endif - main_msg(_("-h or --help\tPrint Help (this message) and exit")); - main_msg(_("--version\t\tPrint version information and exit")); -@@ -3194,10 +3247,24 @@ check_swap_exists_action() - #if defined(STARTUPTIME) || defined(PROTO) - static void time_diff __ARGS((struct timeval *then, struct timeval *now)); - - static struct timeval prev_timeval; - -+# ifdef WIN3264 -+/* -+ * Windows doesn't have gettimeofday(), although it does have struct timeval. -+ */ -+ static int -+gettimeofday(struct timeval *tv, char *dummy) -+{ -+ long t = clock(); -+ tv->tv_sec = t / CLOCKS_PER_SEC; -+ tv->tv_usec = (t - tv->tv_sec * CLOCKS_PER_SEC) * 1000000 / CLOCKS_PER_SEC; -+ return 0; -+} -+# endif -+ - /* - * Save the previous time before doing something that could nest. - * set "*tv_rel" to the time elapsed so far. - */ - void -@@ -3282,24 +3349,10 @@ time_msg(msg, tv_start) - prev_timeval = now; - fprintf(time_fd, ": %s\n", msg); - } - } - --# ifdef WIN3264 --/* -- * Windows doesn't have gettimeofday(), although it does have struct timeval. -- */ -- int --gettimeofday(struct timeval *tv, char *dummy) --{ -- long t = clock(); -- tv->tv_sec = t / CLOCKS_PER_SEC; -- tv->tv_usec = (t - tv->tv_sec * CLOCKS_PER_SEC) * 1000000 / CLOCKS_PER_SEC; -- return 0; --} --# endif -- - #endif - - #if defined(FEAT_CLIENTSERVER) || defined(PROTO) - - /* -@@ -3637,11 +3690,11 @@ cmdsrv_main(argc, argv, serverName_arg, - if (called_emsg) - mch_errmsg("\n"); - } - else if (STRICMP(argv[i], "--servername") == 0) - { -- /* Alredy processed. Take it out of the command line */ -+ /* Already processed. Take it out of the command line */ - i++; - continue; - } - else - { -@@ -3838,14 +3891,13 @@ eval_client_expr_to_string(expr) - /* - * If conversion is needed, convert "data" from "client_enc" to 'encoding' and - * return an allocated string. Otherwise return "data". - * "*tofree" is set to the result when it needs to be freed later. - */ --/*ARGSUSED*/ - char_u * - serverConvert(client_enc, data, tofree) -- char_u *client_enc; -+ char_u *client_enc UNUSED; - char_u *data; - char_u **tofree; - { - char_u *res = data; - ---- vim72.orig/src/mark.c -+++ vim72/src/mark.c -@@ -882,14 +882,13 @@ ex_delmarks(eap) - - #if defined(FEAT_JUMPLIST) || defined(PROTO) - /* - * print the jumplist - */ --/*ARGSUSED*/ - void - ex_jumps(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - int i; - char_u *name; - - cleanup_jumplist(); -@@ -931,14 +930,13 @@ ex_jumps(eap) - } - - /* - * print the changelist - */ --/*ARGSUSED*/ - void - ex_changes(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - int i; - char_u *name; - - /* Highlight title */ -@@ -1021,10 +1019,13 @@ mark_adjust(line1, line2, amount, amount - { - int i; - int fnum = curbuf->b_fnum; - linenr_T *lp; - win_T *win; -+#ifdef FEAT_WINDOWS -+ tabpage_T *tab; -+#endif - - if (line2 < line1 && amount_after == 0L) /* nothing to do */ - return; - - if (!cmdmod.lockmarks) -@@ -1062,11 +1063,11 @@ mark_adjust(line1, line2, amount, amount - - #ifdef FEAT_QUICKFIX - /* quickfix marks */ - qf_mark_adjust(NULL, line1, line2, amount, amount_after); - /* location lists */ -- FOR_ALL_WINDOWS(win) -+ FOR_ALL_TAB_WINDOWS(tab, win) - qf_mark_adjust(win, line1, line2, amount, amount_after); - #endif - - #ifdef FEAT_SIGNS - sign_mark_adjust(line1, line2, amount, amount_after); -@@ -1084,11 +1085,11 @@ mark_adjust(line1, line2, amount, amount - one_adjust_nodel(&(saved_cursor.lnum)); - - /* - * Adjust items in all windows related to the current buffer. - */ -- FOR_ALL_WINDOWS(win) -+ FOR_ALL_TAB_WINDOWS(tab, win) - { - #ifdef FEAT_JUMPLIST - if (!cmdmod.lockmarks) - /* Marks in the jumplist. When deleting lines, this may create - * duplicate marks in the jumplist, they will be removed later. */ -@@ -1625,19 +1626,21 @@ write_one_mark(fp_out, c, pos) - fprintf(fp_out, "\t%c\t%ld\t%d\n", c, (long)pos->lnum, (int)pos->col); - } - - /* - * Handle marks in the viminfo file: -- * fp_out == NULL read marks for current buffer only -- * fp_out != NULL copy marks for buffers not in buffer list -+ * fp_out != NULL: copy marks for buffers not in buffer list -+ * fp_out == NULL && (flags & VIF_WANT_MARKS): read marks for curbuf only -+ * fp_out == NULL && (flags & VIF_GET_OLDFILES | VIF_FORCEIT): fill v:oldfiles - */ - void --copy_viminfo_marks(virp, fp_out, count, eof) -+copy_viminfo_marks(virp, fp_out, count, eof, flags) - vir_T *virp; - FILE *fp_out; - int count; - int eof; -+ int flags; - { - char_u *line = virp->vir_line; - buf_T *buf; - int num_marked_files; - int load_marks; -@@ -1645,14 +1648,27 @@ copy_viminfo_marks(virp, fp_out, count, - char_u *str; - int i; - char_u *p; - char_u *name_buf; - pos_T pos; -+#ifdef FEAT_EVAL -+ list_T *list = NULL; -+#endif - - if ((name_buf = alloc(LSIZE)) == NULL) - return; - *name_buf = NUL; -+ -+#ifdef FEAT_EVAL -+ if (fp_out == NULL && (flags & (VIF_GET_OLDFILES | VIF_FORCEIT))) -+ { -+ list = list_alloc(); -+ if (list != NULL) -+ set_vim_var_list(VV_OLDFILES, list); -+ } -+#endif -+ - num_marked_files = get_viminfo_parameter('\''); - while (!eof && (count < num_marked_files || fp_out == NULL)) - { - if (line[0] != '>') - { -@@ -1679,18 +1695,23 @@ copy_viminfo_marks(virp, fp_out, count, - p--; - if (*p) - p++; - *p = NUL; - -+#ifdef FEAT_EVAL -+ if (list != NULL) -+ list_append_string(list, str, -1); -+#endif -+ - /* - * If fp_out == NULL, load marks for current buffer. - * If fp_out != NULL, copy marks for buffers not in buflist. - */ - load_marks = copy_marks_out = FALSE; - if (fp_out == NULL) - { -- if (curbuf->b_ffname != NULL) -+ if ((flags & VIF_WANT_MARKS) && curbuf->b_ffname != NULL) - { - if (*name_buf == NUL) /* only need to do this once */ - home_replace(NULL, curbuf->b_ffname, name_buf, LSIZE, TRUE); - if (fnamecmp(str, name_buf) == 0) - load_marks = TRUE; ---- vim72.orig/src/mbyte.c -+++ vim72/src/mbyte.c -@@ -24,11 +24,11 @@ - * The cell width on the display needs to be determined from - * the character value. - * Recognizing bytes is easy: 0xxx.xxxx is a single-byte - * char, 10xx.xxxx is a trailing byte, 11xx.xxxx is a leading - * byte of a multi-byte character. -- * To make things complicated, up to two composing characters -+ * To make things complicated, up to six composing characters - * are allowed. These are drawn on top of the first char. - * For most editing the sequence of bytes with composing - * characters included is considered to be one character. - * "enc_unicode" When 2 use 16-bit Unicode characters (or UTF-16). - * When 4 use 32-but Unicode characters. -@@ -125,29 +125,50 @@ - - static int enc_canon_search __ARGS((char_u *name)); - static int dbcs_char2len __ARGS((int c)); - static int dbcs_char2bytes __ARGS((int c, char_u *buf)); - static int dbcs_ptr2len __ARGS((char_u *p)); -+static int dbcs_ptr2len_len __ARGS((char_u *p, int size)); -+static int utf_ptr2cells_len __ARGS((char_u *p, int size)); - static int dbcs_char2cells __ARGS((int c)); -+static int dbcs_ptr2cells_len __ARGS((char_u *p, int size)); - static int dbcs_ptr2char __ARGS((char_u *p)); - --/* Lookup table to quickly get the length in bytes of a UTF-8 character from -- * the first byte of a UTF-8 string. Bytes which are illegal when used as the -- * first byte have a one, because these will be used separately. */ -+/* -+ * Lookup table to quickly get the length in bytes of a UTF-8 character from -+ * the first byte of a UTF-8 string. -+ * Bytes which are illegal when used as the first byte have a 1. -+ * The NUL byte has length 1. -+ */ - static char utf8len_tab[256] = - { - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /*bogus*/ -- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /*bogus*/ -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1, - }; - - /* -+ * Like utf8len_tab above, but using a zero for illegal lead bytes. -+ */ -+static char utf8len_tab_zero[256] = -+{ -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -+ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,0,0, -+}; -+ -+/* - * XIM often causes trouble. Define XIM_DEBUG to get a log of XIM callbacks - * in the "xim.log" file. - */ - /* #define XIM_DEBUG */ - #ifdef XIM_DEBUG -@@ -604,35 +625,41 @@ codepage_invalid: - * Set the function pointers. - */ - if (enc_utf8) - { - mb_ptr2len = utfc_ptr2len; -+ mb_ptr2len_len = utfc_ptr2len_len; - mb_char2len = utf_char2len; - mb_char2bytes = utf_char2bytes; - mb_ptr2cells = utf_ptr2cells; -+ mb_ptr2cells_len = utf_ptr2cells_len; - mb_char2cells = utf_char2cells; - mb_off2cells = utf_off2cells; - mb_ptr2char = utf_ptr2char; - mb_head_off = utf_head_off; - } - else if (enc_dbcs != 0) - { - mb_ptr2len = dbcs_ptr2len; -+ mb_ptr2len_len = dbcs_ptr2len_len; - mb_char2len = dbcs_char2len; - mb_char2bytes = dbcs_char2bytes; - mb_ptr2cells = dbcs_ptr2cells; -+ mb_ptr2cells_len = dbcs_ptr2cells_len; - mb_char2cells = dbcs_char2cells; - mb_off2cells = dbcs_off2cells; - mb_ptr2char = dbcs_ptr2char; - mb_head_off = dbcs_head_off; - } - else - { - mb_ptr2len = latin_ptr2len; -+ mb_ptr2len_len = latin_ptr2len_len; - mb_char2len = latin_char2len; - mb_char2bytes = latin_char2bytes; - mb_ptr2cells = latin_ptr2cells; -+ mb_ptr2cells_len = latin_ptr2cells_len; - mb_char2cells = latin_char2cells; - mb_off2cells = latin_off2cells; - mb_ptr2char = latin_ptr2char; - mb_head_off = latin_head_off; - } -@@ -715,11 +742,11 @@ codepage_invalid: - * mblen() should return -1 for invalid (means the leading - * multibyte) character. However there are some platforms - * where mblen() returns 0 for invalid character. - * Therefore, following condition includes 0. - */ -- (void)mblen(NULL, 0); /* First reset the state. */ -+ ignored = mblen(NULL, 0); /* First reset the state. */ - if (mblen(buf, (size_t)1) <= 0) - n = 2; - else - n = 1; - } -@@ -1013,14 +1040,13 @@ dbcs_class(lead, trail) - /* - * mb_char2len() function pointer. - * Return length in bytes of character "c". - * Returns 1 for a single-byte character. - */ --/* ARGSUSED */ - int - latin_char2len(c) -- int c; -+ int c UNUSED; - { - return 1; - } - - static int -@@ -1068,11 +1094,10 @@ dbcs_char2bytes(c, buf) - /* - * mb_ptr2len() function pointer. - * Get byte length of character at "*p" but stop at a NUL. - * For UTF-8 this includes following composing characters. - * Returns 0 when *p is NUL. -- * - */ - int - latin_ptr2len(p) - char_u *p; - { -@@ -1090,14 +1115,48 @@ dbcs_ptr2len(p) - if (len == 2 && p[1] == NUL) - len = 1; - return len; - } - -+/* -+ * mb_ptr2len_len() function pointer. -+ * Like mb_ptr2len(), but limit to read "size" bytes. -+ * Returns 0 for an empty string. -+ * Returns 1 for an illegal char or an incomplete byte sequence. -+ */ -+ int -+latin_ptr2len_len(p, size) -+ char_u *p; -+ int size; -+{ -+ if (size < 1 || *p == NUL) -+ return 0; -+ return 1; -+} -+ -+ static int -+dbcs_ptr2len_len(p, size) -+ char_u *p; -+ int size; -+{ -+ int len; -+ -+ if (size < 1 || *p == NUL) -+ return 0; -+ if (size == 1) -+ return 1; -+ /* Check that second byte is not missing. */ -+ len = MB_BYTE2LEN(*p); -+ if (len == 2 && p[1] == NUL) -+ len = 1; -+ return len; -+} -+ - struct interval - { -- unsigned short first; -- unsigned short last; -+ long first; -+ long last; - }; - static int intable __ARGS((struct interval *table, size_t size, int c)); - - /* - * Return TRUE if "c" is in "table[size / sizeof(struct interval)]". -@@ -1139,66 +1198,238 @@ intable(table, size, c) - */ - int - utf_char2cells(c) - int c; - { -- /* sorted list of non-overlapping intervals of East Asian Ambiguous -- * characters, generated with: -- * "uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c" */ -- static struct interval ambiguous[] = { -- {0x00A1, 0x00A1}, {0x00A4, 0x00A4}, {0x00A7, 0x00A8}, -- {0x00AA, 0x00AA}, {0x00AE, 0x00AE}, {0x00B0, 0x00B4}, -- {0x00B6, 0x00BA}, {0x00BC, 0x00BF}, {0x00C6, 0x00C6}, -- {0x00D0, 0x00D0}, {0x00D7, 0x00D8}, {0x00DE, 0x00E1}, -- {0x00E6, 0x00E6}, {0x00E8, 0x00EA}, {0x00EC, 0x00ED}, -- {0x00F0, 0x00F0}, {0x00F2, 0x00F3}, {0x00F7, 0x00FA}, -- {0x00FC, 0x00FC}, {0x00FE, 0x00FE}, {0x0101, 0x0101}, -- {0x0111, 0x0111}, {0x0113, 0x0113}, {0x011B, 0x011B}, -- {0x0126, 0x0127}, {0x012B, 0x012B}, {0x0131, 0x0133}, -- {0x0138, 0x0138}, {0x013F, 0x0142}, {0x0144, 0x0144}, -- {0x0148, 0x014B}, {0x014D, 0x014D}, {0x0152, 0x0153}, -- {0x0166, 0x0167}, {0x016B, 0x016B}, {0x01CE, 0x01CE}, -- {0x01D0, 0x01D0}, {0x01D2, 0x01D2}, {0x01D4, 0x01D4}, -- {0x01D6, 0x01D6}, {0x01D8, 0x01D8}, {0x01DA, 0x01DA}, -- {0x01DC, 0x01DC}, {0x0251, 0x0251}, {0x0261, 0x0261}, -- {0x02C4, 0x02C4}, {0x02C7, 0x02C7}, {0x02C9, 0x02CB}, -- {0x02CD, 0x02CD}, {0x02D0, 0x02D0}, {0x02D8, 0x02DB}, -- {0x02DD, 0x02DD}, {0x02DF, 0x02DF}, {0x0391, 0x03A1}, -- {0x03A3, 0x03A9}, {0x03B1, 0x03C1}, {0x03C3, 0x03C9}, -- {0x0401, 0x0401}, {0x0410, 0x044F}, {0x0451, 0x0451}, -- {0x2010, 0x2010}, {0x2013, 0x2016}, {0x2018, 0x2019}, -- {0x201C, 0x201D}, {0x2020, 0x2022}, {0x2024, 0x2027}, -- {0x2030, 0x2030}, {0x2032, 0x2033}, {0x2035, 0x2035}, -- {0x203B, 0x203B}, {0x203E, 0x203E}, {0x2074, 0x2074}, -- {0x207F, 0x207F}, {0x2081, 0x2084}, {0x20AC, 0x20AC}, -- {0x2103, 0x2103}, {0x2105, 0x2105}, {0x2109, 0x2109}, -- {0x2113, 0x2113}, {0x2116, 0x2116}, {0x2121, 0x2122}, -- {0x2126, 0x2126}, {0x212B, 0x212B}, {0x2153, 0x2154}, -- {0x215B, 0x215E}, {0x2160, 0x216B}, {0x2170, 0x2179}, -- {0x2190, 0x2199}, {0x21B8, 0x21B9}, {0x21D2, 0x21D2}, -- {0x21D4, 0x21D4}, {0x21E7, 0x21E7}, {0x2200, 0x2200}, -- {0x2202, 0x2203}, {0x2207, 0x2208}, {0x220B, 0x220B}, -- {0x220F, 0x220F}, {0x2211, 0x2211}, {0x2215, 0x2215}, -- {0x221A, 0x221A}, {0x221D, 0x2220}, {0x2223, 0x2223}, -- {0x2225, 0x2225}, {0x2227, 0x222C}, {0x222E, 0x222E}, -- {0x2234, 0x2237}, {0x223C, 0x223D}, {0x2248, 0x2248}, -- {0x224C, 0x224C}, {0x2252, 0x2252}, {0x2260, 0x2261}, -- {0x2264, 0x2267}, {0x226A, 0x226B}, {0x226E, 0x226F}, -- {0x2282, 0x2283}, {0x2286, 0x2287}, {0x2295, 0x2295}, -- {0x2299, 0x2299}, {0x22A5, 0x22A5}, {0x22BF, 0x22BF}, -- {0x2312, 0x2312}, {0x2460, 0x24E9}, {0x24EB, 0x254B}, -- {0x2550, 0x2573}, {0x2580, 0x258F}, {0x2592, 0x2595}, -- {0x25A0, 0x25A1}, {0x25A3, 0x25A9}, {0x25B2, 0x25B3}, -- {0x25B6, 0x25B7}, {0x25BC, 0x25BD}, {0x25C0, 0x25C1}, -- {0x25C6, 0x25C8}, {0x25CB, 0x25CB}, {0x25CE, 0x25D1}, -- {0x25E2, 0x25E5}, {0x25EF, 0x25EF}, {0x2605, 0x2606}, -- {0x2609, 0x2609}, {0x260E, 0x260F}, {0x2614, 0x2615}, -- {0x261C, 0x261C}, {0x261E, 0x261E}, {0x2640, 0x2640}, -- {0x2642, 0x2642}, {0x2660, 0x2661}, {0x2663, 0x2665}, -- {0x2667, 0x266A}, {0x266C, 0x266D}, {0x266F, 0x266F}, -- {0x273D, 0x273D}, {0x2776, 0x277F}, {0xE000, 0xF8FF}, -- {0xFFFD, 0xFFFD}, /* {0xF0000, 0xFFFFD}, {0x100000, 0x10FFFD} */ -+ /* Sorted list of non-overlapping intervals of East Asian double width -+ * characters, generated with ../runtime/tools/unicode.vim. */ -+ static struct interval doublewidth[] = -+ { -+ {0x1100, 0x115f}, -+ {0x11a3, 0x11a7}, -+ {0x11fa, 0x11ff}, -+ {0x2329, 0x232a}, -+ {0x2e80, 0x2e99}, -+ {0x2e9b, 0x2ef3}, -+ {0x2f00, 0x2fd5}, -+ {0x2ff0, 0x2ffb}, -+ {0x3000, 0x3029}, -+ {0x3030, 0x303e}, -+ {0x3041, 0x3096}, -+ {0x309b, 0x30ff}, -+ {0x3105, 0x312d}, -+ {0x3131, 0x318e}, -+ {0x3190, 0x31b7}, -+ {0x31c0, 0x31e3}, -+ {0x31f0, 0x321e}, -+ {0x3220, 0x3247}, -+ {0x3250, 0x32fe}, -+ {0x3300, 0x4dbf}, -+ {0x4e00, 0xa48c}, -+ {0xa490, 0xa4c6}, -+ {0xa960, 0xa97c}, -+ {0xac00, 0xd7a3}, -+ {0xd7b0, 0xd7c6}, -+ {0xd7cb, 0xd7fb}, -+ {0xf900, 0xfaff}, -+ {0xfe10, 0xfe19}, -+ {0xfe30, 0xfe52}, -+ {0xfe54, 0xfe66}, -+ {0xfe68, 0xfe6b}, -+ {0xff01, 0xff60}, -+ {0xffe0, 0xffe6}, -+ {0x1f200, 0x1f200}, -+ {0x1f210, 0x1f231}, -+ {0x1f240, 0x1f248}, -+ {0x20000, 0x2fffd}, -+ {0x30000, 0x3fffd} -+ }; -+ /* Sorted list of non-overlapping intervals of East Asian Ambiguous -+ * characters, generated with ../runtime/tools/unicode.vim. */ -+ static struct interval ambiguous[] = -+ { -+ {0x00a1, 0x00a1}, -+ {0x00a4, 0x00a4}, -+ {0x00a7, 0x00a8}, -+ {0x00aa, 0x00aa}, -+ {0x00ad, 0x00ae}, -+ {0x00b0, 0x00b4}, -+ {0x00b6, 0x00ba}, -+ {0x00bc, 0x00bf}, -+ {0x00c6, 0x00c6}, -+ {0x00d0, 0x00d0}, -+ {0x00d7, 0x00d8}, -+ {0x00de, 0x00e1}, -+ {0x00e6, 0x00e6}, -+ {0x00e8, 0x00ea}, -+ {0x00ec, 0x00ed}, -+ {0x00f0, 0x00f0}, -+ {0x00f2, 0x00f3}, -+ {0x00f7, 0x00fa}, -+ {0x00fc, 0x00fc}, -+ {0x00fe, 0x00fe}, -+ {0x0101, 0x0101}, -+ {0x0111, 0x0111}, -+ {0x0113, 0x0113}, -+ {0x011b, 0x011b}, -+ {0x0126, 0x0127}, -+ {0x012b, 0x012b}, -+ {0x0131, 0x0133}, -+ {0x0138, 0x0138}, -+ {0x013f, 0x0142}, -+ {0x0144, 0x0144}, -+ {0x0148, 0x014b}, -+ {0x014d, 0x014d}, -+ {0x0152, 0x0153}, -+ {0x0166, 0x0167}, -+ {0x016b, 0x016b}, -+ {0x01ce, 0x01ce}, -+ {0x01d0, 0x01d0}, -+ {0x01d2, 0x01d2}, -+ {0x01d4, 0x01d4}, -+ {0x01d6, 0x01d6}, -+ {0x01d8, 0x01d8}, -+ {0x01da, 0x01da}, -+ {0x01dc, 0x01dc}, -+ {0x0251, 0x0251}, -+ {0x0261, 0x0261}, -+ {0x02c4, 0x02c4}, -+ {0x02c7, 0x02c7}, -+ {0x02c9, 0x02cb}, -+ {0x02cd, 0x02cd}, -+ {0x02d0, 0x02d0}, -+ {0x02d8, 0x02db}, -+ {0x02dd, 0x02dd}, -+ {0x02df, 0x02df}, -+ {0x0391, 0x03a1}, -+ {0x03a3, 0x03a9}, -+ {0x03b1, 0x03c1}, -+ {0x03c3, 0x03c9}, -+ {0x0401, 0x0401}, -+ {0x0410, 0x044f}, -+ {0x0451, 0x0451}, -+ {0x2010, 0x2010}, -+ {0x2013, 0x2016}, -+ {0x2018, 0x2019}, -+ {0x201c, 0x201d}, -+ {0x2020, 0x2022}, -+ {0x2024, 0x2027}, -+ {0x2030, 0x2030}, -+ {0x2032, 0x2033}, -+ {0x2035, 0x2035}, -+ {0x203b, 0x203b}, -+ {0x203e, 0x203e}, -+ {0x2074, 0x2074}, -+ {0x207f, 0x207f}, -+ {0x2081, 0x2084}, -+ {0x20ac, 0x20ac}, -+ {0x2103, 0x2103}, -+ {0x2105, 0x2105}, -+ {0x2109, 0x2109}, -+ {0x2113, 0x2113}, -+ {0x2116, 0x2116}, -+ {0x2121, 0x2122}, -+ {0x2126, 0x2126}, -+ {0x212b, 0x212b}, -+ {0x2153, 0x2154}, -+ {0x215b, 0x215e}, -+ {0x2160, 0x216b}, -+ {0x2170, 0x2179}, -+ {0x2189, 0x2189}, -+ {0x2190, 0x2199}, -+ {0x21b8, 0x21b9}, -+ {0x21d2, 0x21d2}, -+ {0x21d4, 0x21d4}, -+ {0x21e7, 0x21e7}, -+ {0x2200, 0x2200}, -+ {0x2202, 0x2203}, -+ {0x2207, 0x2208}, -+ {0x220b, 0x220b}, -+ {0x220f, 0x220f}, -+ {0x2211, 0x2211}, -+ {0x2215, 0x2215}, -+ {0x221a, 0x221a}, -+ {0x221d, 0x2220}, -+ {0x2223, 0x2223}, -+ {0x2225, 0x2225}, -+ {0x2227, 0x222c}, -+ {0x222e, 0x222e}, -+ {0x2234, 0x2237}, -+ {0x223c, 0x223d}, -+ {0x2248, 0x2248}, -+ {0x224c, 0x224c}, -+ {0x2252, 0x2252}, -+ {0x2260, 0x2261}, -+ {0x2264, 0x2267}, -+ {0x226a, 0x226b}, -+ {0x226e, 0x226f}, -+ {0x2282, 0x2283}, -+ {0x2286, 0x2287}, -+ {0x2295, 0x2295}, -+ {0x2299, 0x2299}, -+ {0x22a5, 0x22a5}, -+ {0x22bf, 0x22bf}, -+ {0x2312, 0x2312}, -+ {0x2460, 0x24e9}, -+ {0x24eb, 0x254b}, -+ {0x2550, 0x2573}, -+ {0x2580, 0x258f}, -+ {0x2592, 0x2595}, -+ {0x25a0, 0x25a1}, -+ {0x25a3, 0x25a9}, -+ {0x25b2, 0x25b3}, -+ {0x25b6, 0x25b7}, -+ {0x25bc, 0x25bd}, -+ {0x25c0, 0x25c1}, -+ {0x25c6, 0x25c8}, -+ {0x25cb, 0x25cb}, -+ {0x25ce, 0x25d1}, -+ {0x25e2, 0x25e5}, -+ {0x25ef, 0x25ef}, -+ {0x2605, 0x2606}, -+ {0x2609, 0x2609}, -+ {0x260e, 0x260f}, -+ {0x2614, 0x2615}, -+ {0x261c, 0x261c}, -+ {0x261e, 0x261e}, -+ {0x2640, 0x2640}, -+ {0x2642, 0x2642}, -+ {0x2660, 0x2661}, -+ {0x2663, 0x2665}, -+ {0x2667, 0x266a}, -+ {0x266c, 0x266d}, -+ {0x266f, 0x266f}, -+ {0x269e, 0x269f}, -+ {0x26be, 0x26bf}, -+ {0x26c4, 0x26cd}, -+ {0x26cf, 0x26e1}, -+ {0x26e3, 0x26e3}, -+ {0x26e8, 0x26ff}, -+ {0x273d, 0x273d}, -+ {0x2757, 0x2757}, -+ {0x2776, 0x277f}, -+ {0x2b55, 0x2b59}, -+ {0x3248, 0x324f}, -+ {0xe000, 0xf8ff}, -+ {0xfffd, 0xfffd}, -+ {0x1f100, 0x1f10a}, -+ {0x1f110, 0x1f12d}, -+ {0x1f131, 0x1f131}, -+ {0x1f13d, 0x1f13d}, -+ {0x1f13f, 0x1f13f}, -+ {0x1f142, 0x1f142}, -+ {0x1f146, 0x1f146}, -+ {0x1f14a, 0x1f14e}, -+ {0x1f157, 0x1f157}, -+ {0x1f15f, 0x1f15f}, -+ {0x1f179, 0x1f179}, -+ {0x1f17b, 0x1f17c}, -+ {0x1f17f, 0x1f17f}, -+ {0x1f18a, 0x1f18d}, -+ {0x1f190, 0x1f190}, -+ {0xf0000, 0xffffd}, -+ {0x100000, 0x10fffd} - }; - - if (c >= 0x100) - { - #ifdef USE_WCHAR_FUNCTIONS -@@ -1213,24 +1444,11 @@ utf_char2cells(c) - if (n > 1) - return n; - #else - if (!utf_printable(c)) - return 6; /* unprintable, displays <xxxx> */ -- if (c >= 0x1100 -- && (c <= 0x115f /* Hangul Jamo */ -- || c == 0x2329 -- || c == 0x232a -- || (c >= 0x2e80 && c <= 0xa4cf -- && c != 0x303f) /* CJK ... Yi */ -- || (c >= 0xac00 && c <= 0xd7a3) /* Hangul Syllables */ -- || (c >= 0xf900 && c <= 0xfaff) /* CJK Compatibility -- Ideographs */ -- || (c >= 0xfe30 && c <= 0xfe6f) /* CJK Compatibility Forms */ -- || (c >= 0xff00 && c <= 0xff60) /* Fullwidth Forms */ -- || (c >= 0xffe0 && c <= 0xffe6) -- || (c >= 0x20000 && c <= 0x2fffd) -- || (c >= 0x30000 && c <= 0x3fffd))) -+ if (intable(doublewidth, sizeof(doublewidth), c)) - return 2; - #endif - } - - /* Characters below 0x100 are influenced by 'isprint' option */ -@@ -1246,14 +1464,13 @@ utf_char2cells(c) - /* - * mb_ptr2cells() function pointer. - * Return the number of display cells character at "*p" occupies. - * This doesn't take care of unprintable characters, use ptr2cells() for that. - */ --/*ARGSUSED*/ - int - latin_ptr2cells(p) -- char_u *p; -+ char_u *p UNUSED; - { - return 1; - } - - int -@@ -1287,18 +1504,66 @@ dbcs_ptr2cells(p) - return 1; - return MB_BYTE2LEN(*p); - } - - /* -+ * mb_ptr2cells_len() function pointer. -+ * Like mb_ptr2cells(), but limit string length to "size". -+ * For an empty string or truncated character returns 1. -+ */ -+ int -+latin_ptr2cells_len(p, size) -+ char_u *p UNUSED; -+ int size UNUSED; -+{ -+ return 1; -+} -+ -+ static int -+utf_ptr2cells_len(p, size) -+ char_u *p; -+ int size; -+{ -+ int c; -+ -+ /* Need to convert to a wide character. */ -+ if (size > 0 && *p >= 0x80) -+ { -+ if (utf_ptr2len_len(p, size) < utf8len_tab[*p]) -+ return 1; /* truncated */ -+ c = utf_ptr2char(p); -+ /* An illegal byte is displayed as <xx>. */ -+ if (utf_ptr2len(p) == 1 || c == NUL) -+ return 4; -+ /* If the char is ASCII it must be an overlong sequence. */ -+ if (c < 0x80) -+ return char2cells(c); -+ return utf_char2cells(c); -+ } -+ return 1; -+} -+ -+ static int -+dbcs_ptr2cells_len(p, size) -+ char_u *p; -+ int size; -+{ -+ /* Number of cells is equal to number of bytes, except for euc-jp when -+ * the first byte is 0x8e. */ -+ if (size <= 1 || (enc_dbcs == DBCS_JPNU && *p == 0x8e)) -+ return 1; -+ return MB_BYTE2LEN(*p); -+} -+ -+/* - * mb_char2cells() function pointer. - * Return the number of display cells character "c" occupies. - * Only takes care of multi-byte chars, not "^C" and such. - */ --/*ARGSUSED*/ - int - latin_char2cells(c) -- int c; -+ int c UNUSED; - { - return 1; - } - - static int -@@ -1316,15 +1581,14 @@ dbcs_char2cells(c) - /* - * mb_off2cells() function pointer. - * Return number of display cells for char at ScreenLines[off]. - * We make sure that the offset used is less than "max_off". - */ --/*ARGSUSED*/ - int - latin_off2cells(off, max_off) -- unsigned off; -- unsigned max_off; -+ unsigned off UNUSED; -+ unsigned max_off UNUSED; - { - return 1; - } - - int -@@ -1384,11 +1648,11 @@ utf_ptr2char(p) - int len; - - if (p[0] < 0x80) /* be quick for ASCII */ - return p[0]; - -- len = utf8len_tab[p[0]]; -+ len = utf8len_tab_zero[p[0]]; - if (len > 1 && (p[1] & 0xc0) == 0x80) - { - if (len == 2) - return ((p[0] & 0x1f) << 6) + (p[1] & 0x3f); - if ((p[2] & 0xc0) == 0x80) -@@ -1634,10 +1898,11 @@ utf_ptr2len(p) - } - - /* - * Return length of UTF-8 character, obtained from the first byte. - * "b" must be between 0 and 255! -+ * Returns 1 for an invalid first byte value. - */ - int - utf_byte2len(b) - int b; - { -@@ -1648,25 +1913,28 @@ utf_byte2len(b) - * Get the length of UTF-8 byte sequence "p[size]". Does not include any - * following composing characters. - * Returns 1 for "". - * Returns 1 for an illegal byte sequence (also in incomplete byte seq.). - * Returns number > "size" for an incomplete byte sequence. -+ * Never returns zero. - */ - int - utf_ptr2len_len(p, size) - char_u *p; - int size; - { - int len; - int i; - int m; - -- if (*p == NUL) -- return 1; -- m = len = utf8len_tab[*p]; -+ len = utf8len_tab[*p]; -+ if (len == 1) -+ return 1; /* NUL, ascii or illegal lead byte */ - if (len > size) - m = size; /* incomplete byte sequence. */ -+ else -+ m = len; - for (i = 1; i < m; ++i) - if ((p[i] & 0xc0) != 0x80) - return 1; - return len; - } -@@ -1696,11 +1964,11 @@ utfc_ptr2len(p) - /* Check for illegal byte. */ - if (len == 1 && b0 >= 0x80) - return 1; - - /* -- * Check for composing characters. We can handle only the first two, but -+ * Check for composing characters. We can handle only the first six, but - * skip all of them (otherwise the cursor would get stuck). - */ - #ifdef FEAT_ARABIC - prevlen = 0; - #endif -@@ -1718,10 +1986,11 @@ utfc_ptr2len(p) - } - - /* - * Return the number of bytes the UTF-8 encoding of the character at "p[size]" - * takes. This includes following composing characters. -+ * Returns 0 for an empty string. - * Returns 1 for an illegal char or an incomplete byte sequence. - */ - int - utfc_ptr2len_len(p, size) - char_u *p; -@@ -1730,11 +1999,11 @@ utfc_ptr2len_len(p, size) - int len; - #ifdef FEAT_ARABIC - int prevlen; - #endif - -- if (*p == NUL) -+ if (size < 1 || *p == NUL) - return 0; - if (p[0] < 0x80 && (size == 1 || p[1] < 0x80)) /* be quick for ASCII */ - return 1; - - /* Skip over first UTF-8 char, stopping at a NUL byte. */ -@@ -1743,11 +2012,11 @@ utfc_ptr2len_len(p, size) - /* Check for illegal byte and incomplete byte sequence. */ - if ((len == 1 && p[0] >= 0x80) || len > size) - return 1; - - /* -- * Check for composing characters. We can handle only the first two, but -+ * Check for composing characters. We can handle only the first six, but - * skip all of them (otherwise the cursor would get stuck). - */ - #ifdef FEAT_ARABIC - prevlen = 0; - #endif -@@ -1861,42 +2130,202 @@ utf_char2bytes(c, buf) - */ - int - utf_iscomposing(c) - int c; - { -- /* sorted list of non-overlapping intervals */ -+ /* Sorted list of non-overlapping intervals. -+ * Generated by ../runtime/tools/unicode.vim. */ - static struct interval combining[] = - { -- {0x0300, 0x034f}, {0x0360, 0x036f}, {0x0483, 0x0486}, {0x0488, 0x0489}, -- {0x0591, 0x05a1}, {0x05a3, 0x05b9}, {0x05bb, 0x05bd}, {0x05bf, 0x05bf}, -- {0x05c1, 0x05c2}, {0x05c4, 0x05c4}, {0x0610, 0x0615}, {0x064b, 0x0658}, -- {0x0670, 0x0670}, {0x06d6, 0x06dc}, {0x06de, 0x06e4}, {0x06e7, 0x06e8}, -- {0x06ea, 0x06ed}, {0x0711, 0x0711}, {0x0730, 0x074a}, {0x07a6, 0x07b0}, -- {0x0901, 0x0903}, {0x093c, 0x093c}, {0x093e, 0x094d}, {0x0951, 0x0954}, -- {0x0962, 0x0963}, {0x0981, 0x0983}, {0x09bc, 0x09bc}, {0x09be, 0x09c4}, -- {0x09c7, 0x09c8}, {0x09cb, 0x09cd}, {0x09d7, 0x09d7}, {0x09e2, 0x09e3}, -- {0x0a01, 0x0a03}, {0x0a3c, 0x0a3c}, {0x0a3e, 0x0a42}, {0x0a47, 0x0a48}, -- {0x0a4b, 0x0a4d}, {0x0a70, 0x0a71}, {0x0a81, 0x0a83}, {0x0abc, 0x0abc}, -- {0x0abe, 0x0ac5}, {0x0ac7, 0x0ac9}, {0x0acb, 0x0acd}, {0x0ae2, 0x0ae3}, -- {0x0b01, 0x0b03}, {0x0b3c, 0x0b3c}, {0x0b3e, 0x0b43}, {0x0b47, 0x0b48}, -- {0x0b4b, 0x0b4d}, {0x0b56, 0x0b57}, {0x0b82, 0x0b82}, {0x0bbe, 0x0bc2}, -- {0x0bc6, 0x0bc8}, {0x0bca, 0x0bcd}, {0x0bd7, 0x0bd7}, {0x0c01, 0x0c03}, -- {0x0c3e, 0x0c44}, {0x0c46, 0x0c48}, {0x0c4a, 0x0c4d}, {0x0c55, 0x0c56}, -- {0x0c82, 0x0c83}, {0x0cbc, 0x0cbc}, {0x0cbe, 0x0cc4}, {0x0cc6, 0x0cc8}, -- {0x0cca, 0x0ccd}, {0x0cd5, 0x0cd6}, {0x0d02, 0x0d03}, {0x0d3e, 0x0d43}, -- {0x0d46, 0x0d48}, {0x0d4a, 0x0d4d}, {0x0d57, 0x0d57}, {0x0d82, 0x0d83}, -- {0x0dca, 0x0dca}, {0x0dcf, 0x0dd4}, {0x0dd6, 0x0dd6}, {0x0dd8, 0x0ddf}, -- {0x0df2, 0x0df3}, {0x0e31, 0x0e31}, {0x0e34, 0x0e3a}, {0x0e47, 0x0e4e}, -- {0x0eb1, 0x0eb1}, {0x0eb4, 0x0eb9}, {0x0ebb, 0x0ebc}, {0x0ec8, 0x0ecd}, -- {0x0f18, 0x0f19}, {0x0f35, 0x0f35}, {0x0f37, 0x0f37}, {0x0f39, 0x0f39}, -- {0x0f3e, 0x0f3f}, {0x0f71, 0x0f84}, {0x0f86, 0x0f87}, {0x0f90, 0x0f97}, -- {0x0f99, 0x0fbc}, {0x0fc6, 0x0fc6}, {0x102c, 0x1032}, {0x1036, 0x1039}, -- {0x1056, 0x1059}, {0x1712, 0x1714}, {0x1732, 0x1734}, {0x1752, 0x1753}, -- {0x1772, 0x1773}, {0x17b6, 0x17d3}, {0x17dd, 0x17dd}, {0x180b, 0x180d}, -- {0x18a9, 0x18a9}, {0x1920, 0x192b}, {0x1930, 0x193b}, {0x20d0, 0x20ea}, -- {0x302a, 0x302f}, {0x3099, 0x309a}, {0xfb1e, 0xfb1e}, {0xfe00, 0xfe0f}, -- {0xfe20, 0xfe23}, -+ {0x0300, 0x036f}, -+ {0x0483, 0x0489}, -+ {0x0591, 0x05bd}, -+ {0x05bf, 0x05bf}, -+ {0x05c1, 0x05c2}, -+ {0x05c4, 0x05c5}, -+ {0x05c7, 0x05c7}, -+ {0x0610, 0x061a}, -+ {0x064b, 0x065e}, -+ {0x0670, 0x0670}, -+ {0x06d6, 0x06dc}, -+ {0x06de, 0x06e4}, -+ {0x06e7, 0x06e8}, -+ {0x06ea, 0x06ed}, -+ {0x0711, 0x0711}, -+ {0x0730, 0x074a}, -+ {0x07a6, 0x07b0}, -+ {0x07eb, 0x07f3}, -+ {0x0816, 0x0819}, -+ {0x081b, 0x0823}, -+ {0x0825, 0x0827}, -+ {0x0829, 0x082d}, -+ {0x0900, 0x0903}, -+ {0x093c, 0x093c}, -+ {0x093e, 0x094e}, -+ {0x0951, 0x0955}, -+ {0x0962, 0x0963}, -+ {0x0981, 0x0983}, -+ {0x09bc, 0x09bc}, -+ {0x09be, 0x09c4}, -+ {0x09c7, 0x09c8}, -+ {0x09cb, 0x09cd}, -+ {0x09d7, 0x09d7}, -+ {0x09e2, 0x09e3}, -+ {0x0a01, 0x0a03}, -+ {0x0a3c, 0x0a3c}, -+ {0x0a3e, 0x0a42}, -+ {0x0a47, 0x0a48}, -+ {0x0a4b, 0x0a4d}, -+ {0x0a51, 0x0a51}, -+ {0x0a70, 0x0a71}, -+ {0x0a75, 0x0a75}, -+ {0x0a81, 0x0a83}, -+ {0x0abc, 0x0abc}, -+ {0x0abe, 0x0ac5}, -+ {0x0ac7, 0x0ac9}, -+ {0x0acb, 0x0acd}, -+ {0x0ae2, 0x0ae3}, -+ {0x0b01, 0x0b03}, -+ {0x0b3c, 0x0b3c}, -+ {0x0b3e, 0x0b44}, -+ {0x0b47, 0x0b48}, -+ {0x0b4b, 0x0b4d}, -+ {0x0b56, 0x0b57}, -+ {0x0b62, 0x0b63}, -+ {0x0b82, 0x0b82}, -+ {0x0bbe, 0x0bc2}, -+ {0x0bc6, 0x0bc8}, -+ {0x0bca, 0x0bcd}, -+ {0x0bd7, 0x0bd7}, -+ {0x0c01, 0x0c03}, -+ {0x0c3e, 0x0c44}, -+ {0x0c46, 0x0c48}, -+ {0x0c4a, 0x0c4d}, -+ {0x0c55, 0x0c56}, -+ {0x0c62, 0x0c63}, -+ {0x0c82, 0x0c83}, -+ {0x0cbc, 0x0cbc}, -+ {0x0cbe, 0x0cc4}, -+ {0x0cc6, 0x0cc8}, -+ {0x0cca, 0x0ccd}, -+ {0x0cd5, 0x0cd6}, -+ {0x0ce2, 0x0ce3}, -+ {0x0d02, 0x0d03}, -+ {0x0d3e, 0x0d44}, -+ {0x0d46, 0x0d48}, -+ {0x0d4a, 0x0d4d}, -+ {0x0d57, 0x0d57}, -+ {0x0d62, 0x0d63}, -+ {0x0d82, 0x0d83}, -+ {0x0dca, 0x0dca}, -+ {0x0dcf, 0x0dd4}, -+ {0x0dd6, 0x0dd6}, -+ {0x0dd8, 0x0ddf}, -+ {0x0df2, 0x0df3}, -+ {0x0e31, 0x0e31}, -+ {0x0e34, 0x0e3a}, -+ {0x0e47, 0x0e4e}, -+ {0x0eb1, 0x0eb1}, -+ {0x0eb4, 0x0eb9}, -+ {0x0ebb, 0x0ebc}, -+ {0x0ec8, 0x0ecd}, -+ {0x0f18, 0x0f19}, -+ {0x0f35, 0x0f35}, -+ {0x0f37, 0x0f37}, -+ {0x0f39, 0x0f39}, -+ {0x0f3e, 0x0f3f}, -+ {0x0f71, 0x0f84}, -+ {0x0f86, 0x0f87}, -+ {0x0f90, 0x0f97}, -+ {0x0f99, 0x0fbc}, -+ {0x0fc6, 0x0fc6}, -+ {0x102b, 0x103e}, -+ {0x1056, 0x1059}, -+ {0x105e, 0x1060}, -+ {0x1062, 0x1064}, -+ {0x1067, 0x106d}, -+ {0x1071, 0x1074}, -+ {0x1082, 0x108d}, -+ {0x108f, 0x108f}, -+ {0x109a, 0x109d}, -+ {0x135f, 0x135f}, -+ {0x1712, 0x1714}, -+ {0x1732, 0x1734}, -+ {0x1752, 0x1753}, -+ {0x1772, 0x1773}, -+ {0x17b6, 0x17d3}, -+ {0x17dd, 0x17dd}, -+ {0x180b, 0x180d}, -+ {0x18a9, 0x18a9}, -+ {0x1920, 0x192b}, -+ {0x1930, 0x193b}, -+ {0x19b0, 0x19c0}, -+ {0x19c8, 0x19c9}, -+ {0x1a17, 0x1a1b}, -+ {0x1a55, 0x1a5e}, -+ {0x1a60, 0x1a7c}, -+ {0x1a7f, 0x1a7f}, -+ {0x1b00, 0x1b04}, -+ {0x1b34, 0x1b44}, -+ {0x1b6b, 0x1b73}, -+ {0x1b80, 0x1b82}, -+ {0x1ba1, 0x1baa}, -+ {0x1c24, 0x1c37}, -+ {0x1cd0, 0x1cd2}, -+ {0x1cd4, 0x1ce8}, -+ {0x1ced, 0x1ced}, -+ {0x1cf2, 0x1cf2}, -+ {0x1dc0, 0x1de6}, -+ {0x1dfd, 0x1dff}, -+ {0x20d0, 0x20f0}, -+ {0x2cef, 0x2cf1}, -+ {0x2de0, 0x2dff}, -+ {0x302a, 0x302f}, -+ {0x3099, 0x309a}, -+ {0xa66f, 0xa672}, -+ {0xa67c, 0xa67d}, -+ {0xa6f0, 0xa6f1}, -+ {0xa802, 0xa802}, -+ {0xa806, 0xa806}, -+ {0xa80b, 0xa80b}, -+ {0xa823, 0xa827}, -+ {0xa880, 0xa881}, -+ {0xa8b4, 0xa8c4}, -+ {0xa8e0, 0xa8f1}, -+ {0xa926, 0xa92d}, -+ {0xa947, 0xa953}, -+ {0xa980, 0xa983}, -+ {0xa9b3, 0xa9c0}, -+ {0xaa29, 0xaa36}, -+ {0xaa43, 0xaa43}, -+ {0xaa4c, 0xaa4d}, -+ {0xaa7b, 0xaa7b}, -+ {0xaab0, 0xaab0}, -+ {0xaab2, 0xaab4}, -+ {0xaab7, 0xaab8}, -+ {0xaabe, 0xaabf}, -+ {0xaac1, 0xaac1}, -+ {0xabe3, 0xabea}, -+ {0xabec, 0xabed}, -+ {0xfb1e, 0xfb1e}, -+ {0xfe00, 0xfe0f}, -+ {0xfe20, 0xfe26}, -+ {0x101fd, 0x101fd}, -+ {0x10a01, 0x10a03}, -+ {0x10a05, 0x10a06}, -+ {0x10a0c, 0x10a0f}, -+ {0x10a38, 0x10a3a}, -+ {0x10a3f, 0x10a3f}, -+ {0x11080, 0x11082}, -+ {0x110b0, 0x110ba}, -+ {0x1d165, 0x1d169}, -+ {0x1d16d, 0x1d172}, -+ {0x1d17b, 0x1d182}, -+ {0x1d185, 0x1d18b}, -+ {0x1d1aa, 0x1d1ad}, -+ {0x1d242, 0x1d244}, -+ {0xe0100, 0xe01ef} - }; - - return intable(combining, sizeof(combining), c); - } - -@@ -2040,64 +2469,185 @@ utf_class(c) - - /* - * Code for Unicode case-dependent operations. Based on notes in - * http://www.unicode.org/Public/UNIDATA/CaseFolding.txt - * This code uses simple case folding, not full case folding. -+ * Last updated for Unicode 5.2. - */ - - /* -- * The following table is built by foldExtract.pl < CaseFolding.txt . -- * It must be in numeric order, because we use binary search on it. -- * An entry such as {0x41,0x5a,1,32} means that UCS-4 characters in the range -- * from 0x41 to 0x5a inclusive, stepping by 1, are folded by adding 32. -+ * The following tables are built by ../runtime/tools/unicode.vim. -+ * They must be in numeric order, because we use binary search. -+ * An entry such as {0x41,0x5a,1,32} means that Unicode characters in the -+ * range from 0x41 to 0x5a inclusive, stepping by 1, are changed to -+ * folded/upper/lower by adding 32. - */ -- - typedef struct - { - int rangeStart; - int rangeEnd; - int step; - int offset; - } convertStruct; - - static convertStruct foldCase[] = - { -- {0x41,0x5a,1,32}, {0xc0,0xd6,1,32}, {0xd8,0xde,1,32}, -- {0x100,0x12e,2,1}, {0x130,0x130,-1,-199}, {0x132,0x136,2,1}, -- {0x139,0x147,2,1}, {0x14a,0x176,2,1}, {0x178,0x178,-1,-121}, -- {0x179,0x17d,2,1}, {0x181,0x181,-1,210}, {0x182,0x184,2,1}, -- {0x186,0x186,-1,206}, {0x187,0x187,-1,1}, {0x189,0x18a,1,205}, -- {0x18b,0x18b,-1,1}, {0x18e,0x18e,-1,79}, {0x18f,0x18f,-1,202}, -- {0x190,0x190,-1,203}, {0x191,0x191,-1,1}, {0x193,0x193,-1,205}, -- {0x194,0x194,-1,207}, {0x196,0x196,-1,211}, {0x197,0x197,-1,209}, -- {0x198,0x198,-1,1}, {0x19c,0x19c,-1,211}, {0x19d,0x19d,-1,213}, -- {0x19f,0x19f,-1,214}, {0x1a0,0x1a4,2,1}, {0x1a6,0x1a6,-1,218}, -- {0x1a7,0x1a7,-1,1}, {0x1a9,0x1a9,-1,218}, {0x1ac,0x1ac,-1,1}, -- {0x1ae,0x1ae,-1,218}, {0x1af,0x1af,-1,1}, {0x1b1,0x1b2,1,217}, -- {0x1b3,0x1b5,2,1}, {0x1b7,0x1b7,-1,219}, {0x1b8,0x1bc,4,1}, -- {0x1c4,0x1c4,-1,2}, {0x1c5,0x1c5,-1,1}, {0x1c7,0x1c7,-1,2}, -- {0x1c8,0x1c8,-1,1}, {0x1ca,0x1ca,-1,2}, {0x1cb,0x1db,2,1}, -- {0x1de,0x1ee,2,1}, {0x1f1,0x1f1,-1,2}, {0x1f2,0x1f4,2,1}, -- {0x1f6,0x1f6,-1,-97}, {0x1f7,0x1f7,-1,-56}, {0x1f8,0x21e,2,1}, -- {0x220,0x220,-1,-130}, {0x222,0x232,2,1}, {0x386,0x386,-1,38}, -- {0x388,0x38a,1,37}, {0x38c,0x38c,-1,64}, {0x38e,0x38f,1,63}, -- {0x391,0x3a1,1,32}, {0x3a3,0x3ab,1,32}, {0x3d8,0x3ee,2,1}, -- {0x3f4,0x3f4,-1,-60}, {0x3f7,0x3f7,-1,1}, {0x3f9,0x3f9,-1,-7}, -- {0x3fa,0x3fa,-1,1}, {0x400,0x40f,1,80}, {0x410,0x42f,1,32}, -- {0x460,0x480,2,1}, {0x48a,0x4be,2,1}, {0x4c1,0x4cd,2,1}, -- {0x4d0,0x4f4,2,1}, {0x4f8,0x500,8,1}, {0x502,0x50e,2,1}, -- {0x531,0x556,1,48}, {0x1e00,0x1e94,2,1}, {0x1ea0,0x1ef8,2,1}, -- {0x1f08,0x1f0f,1,-8}, {0x1f18,0x1f1d,1,-8}, {0x1f28,0x1f2f,1,-8}, -- {0x1f38,0x1f3f,1,-8}, {0x1f48,0x1f4d,1,-8}, {0x1f59,0x1f5f,2,-8}, -- {0x1f68,0x1f6f,1,-8}, {0x1f88,0x1f8f,1,-8}, {0x1f98,0x1f9f,1,-8}, -- {0x1fa8,0x1faf,1,-8}, {0x1fb8,0x1fb9,1,-8}, {0x1fba,0x1fbb,1,-74}, -- {0x1fbc,0x1fbc,-1,-9}, {0x1fc8,0x1fcb,1,-86}, {0x1fcc,0x1fcc,-1,-9}, -- {0x1fd8,0x1fd9,1,-8}, {0x1fda,0x1fdb,1,-100}, {0x1fe8,0x1fe9,1,-8}, -- {0x1fea,0x1feb,1,-112}, {0x1fec,0x1fec,-1,-7}, {0x1ff8,0x1ff9,1,-128}, -- {0x1ffa,0x1ffb,1,-126}, {0x1ffc,0x1ffc,-1,-9}, {0x2126,0x2126,-1,-7517}, -- {0x212a,0x212a,-1,-8383}, {0x212b,0x212b,-1,-8262}, -- {0x2160,0x216f,1,16}, {0x24b6,0x24cf,1,26}, {0xff21,0xff3a,1,32}, -+ {0x41,0x5a,1,32}, -+ {0xb5,0xb5,-1,775}, -+ {0xc0,0xd6,1,32}, -+ {0xd8,0xde,1,32}, -+ {0x100,0x12e,2,1}, -+ {0x132,0x136,2,1}, -+ {0x139,0x147,2,1}, -+ {0x14a,0x176,2,1}, -+ {0x178,0x178,-1,-121}, -+ {0x179,0x17d,2,1}, -+ {0x17f,0x17f,-1,-268}, -+ {0x181,0x181,-1,210}, -+ {0x182,0x184,2,1}, -+ {0x186,0x186,-1,206}, -+ {0x187,0x187,-1,1}, -+ {0x189,0x18a,1,205}, -+ {0x18b,0x18b,-1,1}, -+ {0x18e,0x18e,-1,79}, -+ {0x18f,0x18f,-1,202}, -+ {0x190,0x190,-1,203}, -+ {0x191,0x191,-1,1}, -+ {0x193,0x193,-1,205}, -+ {0x194,0x194,-1,207}, -+ {0x196,0x196,-1,211}, -+ {0x197,0x197,-1,209}, -+ {0x198,0x198,-1,1}, -+ {0x19c,0x19c,-1,211}, -+ {0x19d,0x19d,-1,213}, -+ {0x19f,0x19f,-1,214}, -+ {0x1a0,0x1a4,2,1}, -+ {0x1a6,0x1a6,-1,218}, -+ {0x1a7,0x1a7,-1,1}, -+ {0x1a9,0x1a9,-1,218}, -+ {0x1ac,0x1ac,-1,1}, -+ {0x1ae,0x1ae,-1,218}, -+ {0x1af,0x1af,-1,1}, -+ {0x1b1,0x1b2,1,217}, -+ {0x1b3,0x1b5,2,1}, -+ {0x1b7,0x1b7,-1,219}, -+ {0x1b8,0x1bc,4,1}, -+ {0x1c4,0x1c4,-1,2}, -+ {0x1c5,0x1c5,-1,1}, -+ {0x1c7,0x1c7,-1,2}, -+ {0x1c8,0x1c8,-1,1}, -+ {0x1ca,0x1ca,-1,2}, -+ {0x1cb,0x1db,2,1}, -+ {0x1de,0x1ee,2,1}, -+ {0x1f1,0x1f1,-1,2}, -+ {0x1f2,0x1f4,2,1}, -+ {0x1f6,0x1f6,-1,-97}, -+ {0x1f7,0x1f7,-1,-56}, -+ {0x1f8,0x21e,2,1}, -+ {0x220,0x220,-1,-130}, -+ {0x222,0x232,2,1}, -+ {0x23a,0x23a,-1,10795}, -+ {0x23b,0x23b,-1,1}, -+ {0x23d,0x23d,-1,-163}, -+ {0x23e,0x23e,-1,10792}, -+ {0x241,0x241,-1,1}, -+ {0x243,0x243,-1,-195}, -+ {0x244,0x244,-1,69}, -+ {0x245,0x245,-1,71}, -+ {0x246,0x24e,2,1}, -+ {0x345,0x345,-1,116}, -+ {0x370,0x372,2,1}, -+ {0x376,0x376,-1,1}, -+ {0x386,0x386,-1,38}, -+ {0x388,0x38a,1,37}, -+ {0x38c,0x38c,-1,64}, -+ {0x38e,0x38f,1,63}, -+ {0x391,0x3a1,1,32}, -+ {0x3a3,0x3ab,1,32}, -+ {0x3c2,0x3c2,-1,1}, -+ {0x3cf,0x3cf,-1,8}, -+ {0x3d0,0x3d0,-1,-30}, -+ {0x3d1,0x3d1,-1,-25}, -+ {0x3d5,0x3d5,-1,-15}, -+ {0x3d6,0x3d6,-1,-22}, -+ {0x3d8,0x3ee,2,1}, -+ {0x3f0,0x3f0,-1,-54}, -+ {0x3f1,0x3f1,-1,-48}, -+ {0x3f4,0x3f4,-1,-60}, -+ {0x3f5,0x3f5,-1,-64}, -+ {0x3f7,0x3f7,-1,1}, -+ {0x3f9,0x3f9,-1,-7}, -+ {0x3fa,0x3fa,-1,1}, -+ {0x3fd,0x3ff,1,-130}, -+ {0x400,0x40f,1,80}, -+ {0x410,0x42f,1,32}, -+ {0x460,0x480,2,1}, -+ {0x48a,0x4be,2,1}, -+ {0x4c0,0x4c0,-1,15}, -+ {0x4c1,0x4cd,2,1}, -+ {0x4d0,0x524,2,1}, -+ {0x531,0x556,1,48}, -+ {0x10a0,0x10c5,1,7264}, -+ {0x1e00,0x1e94,2,1}, -+ {0x1e9b,0x1e9b,-1,-58}, -+ {0x1e9e,0x1e9e,-1,-7615}, -+ {0x1ea0,0x1efe,2,1}, -+ {0x1f08,0x1f0f,1,-8}, -+ {0x1f18,0x1f1d,1,-8}, -+ {0x1f28,0x1f2f,1,-8}, -+ {0x1f38,0x1f3f,1,-8}, -+ {0x1f48,0x1f4d,1,-8}, -+ {0x1f59,0x1f5f,2,-8}, -+ {0x1f68,0x1f6f,1,-8}, -+ {0x1f88,0x1f8f,1,-8}, -+ {0x1f98,0x1f9f,1,-8}, -+ {0x1fa8,0x1faf,1,-8}, -+ {0x1fb8,0x1fb9,1,-8}, -+ {0x1fba,0x1fbb,1,-74}, -+ {0x1fbc,0x1fbc,-1,-9}, -+ {0x1fbe,0x1fbe,-1,-7173}, -+ {0x1fc8,0x1fcb,1,-86}, -+ {0x1fcc,0x1fcc,-1,-9}, -+ {0x1fd8,0x1fd9,1,-8}, -+ {0x1fda,0x1fdb,1,-100}, -+ {0x1fe8,0x1fe9,1,-8}, -+ {0x1fea,0x1feb,1,-112}, -+ {0x1fec,0x1fec,-1,-7}, -+ {0x1ff8,0x1ff9,1,-128}, -+ {0x1ffa,0x1ffb,1,-126}, -+ {0x1ffc,0x1ffc,-1,-9}, -+ {0x2126,0x2126,-1,-7517}, -+ {0x212a,0x212a,-1,-8383}, -+ {0x212b,0x212b,-1,-8262}, -+ {0x2132,0x2132,-1,28}, -+ {0x2160,0x216f,1,16}, -+ {0x2183,0x2183,-1,1}, -+ {0x24b6,0x24cf,1,26}, -+ {0x2c00,0x2c2e,1,48}, -+ {0x2c60,0x2c60,-1,1}, -+ {0x2c62,0x2c62,-1,-10743}, -+ {0x2c63,0x2c63,-1,-3814}, -+ {0x2c64,0x2c64,-1,-10727}, -+ {0x2c67,0x2c6b,2,1}, -+ {0x2c6d,0x2c6d,-1,-10780}, -+ {0x2c6e,0x2c6e,-1,-10749}, -+ {0x2c6f,0x2c6f,-1,-10783}, -+ {0x2c70,0x2c70,-1,-10782}, -+ {0x2c72,0x2c75,3,1}, -+ {0x2c7e,0x2c7f,1,-10815}, -+ {0x2c80,0x2ce2,2,1}, -+ {0x2ceb,0x2ced,2,1}, -+ {0xa640,0xa65e,2,1}, -+ {0xa662,0xa66c,2,1}, -+ {0xa680,0xa696,2,1}, -+ {0xa722,0xa72e,2,1}, -+ {0xa732,0xa76e,2,1}, -+ {0xa779,0xa77b,2,1}, -+ {0xa77d,0xa77d,-1,-35332}, -+ {0xa77e,0xa786,2,1}, -+ {0xa78b,0xa78b,-1,1}, -+ {0xff21,0xff3a,1,32}, - {0x10400,0x10427,1,40} - }; - - static int utf_convert(int a, convertStruct table[], int tableSize); - -@@ -2141,89 +2691,310 @@ utf_fold(a) - int a; - { - return utf_convert(a, foldCase, sizeof(foldCase)); - } - --/* -- * The following tables are built by upperLowerExtract.pl < UnicodeData.txt . -- * They must be in numeric order, because we use binary search on them. -- * An entry such as {0x41,0x5a,1,32} means that UCS-4 characters in the range -- * from 0x41 to 0x5a inclusive, stepping by 1, are switched to lower (for -- * example) by adding 32. -- */ - static convertStruct toLower[] = - { -- {0x41,0x5a,1,32}, {0xc0,0xd6,1,32}, {0xd8,0xde,1,32}, -- {0x100,0x12e,2,1}, {0x130,0x130,-1,-199}, {0x132,0x136,2,1}, -- {0x139,0x147,2,1}, {0x14a,0x176,2,1}, {0x178,0x178,-1,-121}, -- {0x179,0x17d,2,1}, {0x181,0x181,-1,210}, {0x182,0x184,2,1}, -- {0x186,0x186,-1,206}, {0x187,0x187,-1,1}, {0x189,0x18a,1,205}, -- {0x18b,0x18b,-1,1}, {0x18e,0x18e,-1,79}, {0x18f,0x18f,-1,202}, -- {0x190,0x190,-1,203}, {0x191,0x191,-1,1}, {0x193,0x193,-1,205}, -- {0x194,0x194,-1,207}, {0x196,0x196,-1,211}, {0x197,0x197,-1,209}, -- {0x198,0x198,-1,1}, {0x19c,0x19c,-1,211}, {0x19d,0x19d,-1,213}, -- {0x19f,0x19f,-1,214}, {0x1a0,0x1a4,2,1}, {0x1a6,0x1a6,-1,218}, -- {0x1a7,0x1a7,-1,1}, {0x1a9,0x1a9,-1,218}, {0x1ac,0x1ac,-1,1}, -- {0x1ae,0x1ae,-1,218}, {0x1af,0x1af,-1,1}, {0x1b1,0x1b2,1,217}, -- {0x1b3,0x1b5,2,1}, {0x1b7,0x1b7,-1,219}, {0x1b8,0x1bc,4,1}, -- {0x1c4,0x1ca,3,2}, {0x1cd,0x1db,2,1}, {0x1de,0x1ee,2,1}, -- {0x1f1,0x1f1,-1,2}, {0x1f4,0x1f4,-1,1}, {0x1f6,0x1f6,-1,-97}, -- {0x1f7,0x1f7,-1,-56}, {0x1f8,0x21e,2,1}, {0x220,0x220,-1,-130}, -- {0x222,0x232,2,1}, {0x386,0x386,-1,38}, {0x388,0x38a,1,37}, -- {0x38c,0x38c,-1,64}, {0x38e,0x38f,1,63}, {0x391,0x3a1,1,32}, -- {0x3a3,0x3ab,1,32}, {0x3d8,0x3ee,2,1}, {0x3f4,0x3f4,-1,-60}, -- {0x3f7,0x3f7,-1,1}, {0x3f9,0x3f9,-1,-7}, {0x3fa,0x3fa,-1,1}, -- {0x400,0x40f,1,80}, {0x410,0x42f,1,32}, {0x460,0x480,2,1}, -- {0x48a,0x4be,2,1}, {0x4c1,0x4cd,2,1}, {0x4d0,0x4f4,2,1}, -- {0x4f8,0x500,8,1}, {0x502,0x50e,2,1}, {0x531,0x556,1,48}, -- {0x1e00,0x1e94,2,1}, {0x1ea0,0x1ef8,2,1}, {0x1f08,0x1f0f,1,-8}, -- {0x1f18,0x1f1d,1,-8}, {0x1f28,0x1f2f,1,-8}, {0x1f38,0x1f3f,1,-8}, -- {0x1f48,0x1f4d,1,-8}, {0x1f59,0x1f5f,2,-8}, {0x1f68,0x1f6f,1,-8}, -- {0x1fb8,0x1fb9,1,-8}, {0x1fba,0x1fbb,1,-74}, {0x1fc8,0x1fcb,1,-86}, -- {0x1fd8,0x1fd9,1,-8}, {0x1fda,0x1fdb,1,-100}, {0x1fe8,0x1fe9,1,-8}, -- {0x1fea,0x1feb,1,-112}, {0x1fec,0x1fec,-1,-7}, {0x1ff8,0x1ff9,1,-128}, -- {0x1ffa,0x1ffb,1,-126}, {0x2126,0x2126,-1,-7517}, {0x212a,0x212a,-1,-8383}, -- {0x212b,0x212b,-1,-8262}, {0xff21,0xff3a,1,32}, {0x10400,0x10427,1,40} -+ {0x41,0x5a,1,32}, -+ {0xc0,0xd6,1,32}, -+ {0xd8,0xde,1,32}, -+ {0x100,0x12e,2,1}, -+ {0x130,0x130,-1,-199}, -+ {0x132,0x136,2,1}, -+ {0x139,0x147,2,1}, -+ {0x14a,0x176,2,1}, -+ {0x178,0x178,-1,-121}, -+ {0x179,0x17d,2,1}, -+ {0x181,0x181,-1,210}, -+ {0x182,0x184,2,1}, -+ {0x186,0x186,-1,206}, -+ {0x187,0x187,-1,1}, -+ {0x189,0x18a,1,205}, -+ {0x18b,0x18b,-1,1}, -+ {0x18e,0x18e,-1,79}, -+ {0x18f,0x18f,-1,202}, -+ {0x190,0x190,-1,203}, -+ {0x191,0x191,-1,1}, -+ {0x193,0x193,-1,205}, -+ {0x194,0x194,-1,207}, -+ {0x196,0x196,-1,211}, -+ {0x197,0x197,-1,209}, -+ {0x198,0x198,-1,1}, -+ {0x19c,0x19c,-1,211}, -+ {0x19d,0x19d,-1,213}, -+ {0x19f,0x19f,-1,214}, -+ {0x1a0,0x1a4,2,1}, -+ {0x1a6,0x1a6,-1,218}, -+ {0x1a7,0x1a7,-1,1}, -+ {0x1a9,0x1a9,-1,218}, -+ {0x1ac,0x1ac,-1,1}, -+ {0x1ae,0x1ae,-1,218}, -+ {0x1af,0x1af,-1,1}, -+ {0x1b1,0x1b2,1,217}, -+ {0x1b3,0x1b5,2,1}, -+ {0x1b7,0x1b7,-1,219}, -+ {0x1b8,0x1bc,4,1}, -+ {0x1c4,0x1c4,-1,2}, -+ {0x1c5,0x1c5,-1,1}, -+ {0x1c7,0x1c7,-1,2}, -+ {0x1c8,0x1c8,-1,1}, -+ {0x1ca,0x1ca,-1,2}, -+ {0x1cb,0x1db,2,1}, -+ {0x1de,0x1ee,2,1}, -+ {0x1f1,0x1f1,-1,2}, -+ {0x1f2,0x1f4,2,1}, -+ {0x1f6,0x1f6,-1,-97}, -+ {0x1f7,0x1f7,-1,-56}, -+ {0x1f8,0x21e,2,1}, -+ {0x220,0x220,-1,-130}, -+ {0x222,0x232,2,1}, -+ {0x23a,0x23a,-1,10795}, -+ {0x23b,0x23b,-1,1}, -+ {0x23d,0x23d,-1,-163}, -+ {0x23e,0x23e,-1,10792}, -+ {0x241,0x241,-1,1}, -+ {0x243,0x243,-1,-195}, -+ {0x244,0x244,-1,69}, -+ {0x245,0x245,-1,71}, -+ {0x246,0x24e,2,1}, -+ {0x370,0x372,2,1}, -+ {0x376,0x376,-1,1}, -+ {0x386,0x386,-1,38}, -+ {0x388,0x38a,1,37}, -+ {0x38c,0x38c,-1,64}, -+ {0x38e,0x38f,1,63}, -+ {0x391,0x3a1,1,32}, -+ {0x3a3,0x3ab,1,32}, -+ {0x3cf,0x3cf,-1,8}, -+ {0x3d8,0x3ee,2,1}, -+ {0x3f4,0x3f4,-1,-60}, -+ {0x3f7,0x3f7,-1,1}, -+ {0x3f9,0x3f9,-1,-7}, -+ {0x3fa,0x3fa,-1,1}, -+ {0x3fd,0x3ff,1,-130}, -+ {0x400,0x40f,1,80}, -+ {0x410,0x42f,1,32}, -+ {0x460,0x480,2,1}, -+ {0x48a,0x4be,2,1}, -+ {0x4c0,0x4c0,-1,15}, -+ {0x4c1,0x4cd,2,1}, -+ {0x4d0,0x524,2,1}, -+ {0x531,0x556,1,48}, -+ {0x10a0,0x10c5,1,7264}, -+ {0x1e00,0x1e94,2,1}, -+ {0x1e9e,0x1e9e,-1,-7615}, -+ {0x1ea0,0x1efe,2,1}, -+ {0x1f08,0x1f0f,1,-8}, -+ {0x1f18,0x1f1d,1,-8}, -+ {0x1f28,0x1f2f,1,-8}, -+ {0x1f38,0x1f3f,1,-8}, -+ {0x1f48,0x1f4d,1,-8}, -+ {0x1f59,0x1f5f,2,-8}, -+ {0x1f68,0x1f6f,1,-8}, -+ {0x1f88,0x1f8f,1,-8}, -+ {0x1f98,0x1f9f,1,-8}, -+ {0x1fa8,0x1faf,1,-8}, -+ {0x1fb8,0x1fb9,1,-8}, -+ {0x1fba,0x1fbb,1,-74}, -+ {0x1fbc,0x1fbc,-1,-9}, -+ {0x1fc8,0x1fcb,1,-86}, -+ {0x1fcc,0x1fcc,-1,-9}, -+ {0x1fd8,0x1fd9,1,-8}, -+ {0x1fda,0x1fdb,1,-100}, -+ {0x1fe8,0x1fe9,1,-8}, -+ {0x1fea,0x1feb,1,-112}, -+ {0x1fec,0x1fec,-1,-7}, -+ {0x1ff8,0x1ff9,1,-128}, -+ {0x1ffa,0x1ffb,1,-126}, -+ {0x1ffc,0x1ffc,-1,-9}, -+ {0x2126,0x2126,-1,-7517}, -+ {0x212a,0x212a,-1,-8383}, -+ {0x212b,0x212b,-1,-8262}, -+ {0x2132,0x2132,-1,28}, -+ {0x2160,0x216f,1,16}, -+ {0x2183,0x2183,-1,1}, -+ {0x24b6,0x24cf,1,26}, -+ {0x2c00,0x2c2e,1,48}, -+ {0x2c60,0x2c60,-1,1}, -+ {0x2c62,0x2c62,-1,-10743}, -+ {0x2c63,0x2c63,-1,-3814}, -+ {0x2c64,0x2c64,-1,-10727}, -+ {0x2c67,0x2c6b,2,1}, -+ {0x2c6d,0x2c6d,-1,-10780}, -+ {0x2c6e,0x2c6e,-1,-10749}, -+ {0x2c6f,0x2c6f,-1,-10783}, -+ {0x2c70,0x2c70,-1,-10782}, -+ {0x2c72,0x2c75,3,1}, -+ {0x2c7e,0x2c7f,1,-10815}, -+ {0x2c80,0x2ce2,2,1}, -+ {0x2ceb,0x2ced,2,1}, -+ {0xa640,0xa65e,2,1}, -+ {0xa662,0xa66c,2,1}, -+ {0xa680,0xa696,2,1}, -+ {0xa722,0xa72e,2,1}, -+ {0xa732,0xa76e,2,1}, -+ {0xa779,0xa77b,2,1}, -+ {0xa77d,0xa77d,-1,-35332}, -+ {0xa77e,0xa786,2,1}, -+ {0xa78b,0xa78b,-1,1}, -+ {0xff21,0xff3a,1,32}, -+ {0x10400,0x10427,1,40} - }; - - static convertStruct toUpper[] = - { -- {0x61,0x7a,1,-32}, {0xb5,0xb5,-1,743}, {0xe0,0xf6,1,-32}, -- {0xf8,0xfe,1,-32}, {0xff,0xff,-1,121}, {0x101,0x12f,2,-1}, -- {0x131,0x131,-1,-232}, {0x133,0x137,2,-1}, {0x13a,0x148,2,-1}, -- {0x14b,0x177,2,-1}, {0x17a,0x17e,2,-1}, {0x17f,0x17f,-1,-300}, -- {0x183,0x185,2,-1}, {0x188,0x18c,4,-1}, {0x192,0x192,-1,-1}, -- {0x195,0x195,-1,97}, {0x199,0x199,-1,-1}, {0x19e,0x19e,-1,130}, -- {0x1a1,0x1a5,2,-1}, {0x1a8,0x1ad,5,-1}, {0x1b0,0x1b4,4,-1}, -- {0x1b6,0x1b9,3,-1}, {0x1bd,0x1bd,-1,-1}, {0x1bf,0x1bf,-1,56}, -- {0x1c5,0x1c6,1,-1}, {0x1c8,0x1c9,1,-1}, {0x1cb,0x1cc,1,-1}, -- {0x1ce,0x1dc,2,-1}, {0x1dd,0x1dd,-1,-79}, {0x1df,0x1ef,2,-1}, -- {0x1f2,0x1f3,1,-1}, {0x1f5,0x1f9,4,-1}, {0x1fb,0x21f,2,-1}, -- {0x223,0x233,2,-1}, {0x253,0x253,-1,-210}, {0x254,0x254,-1,-206}, -- {0x256,0x257,1,-205}, {0x259,0x259,-1,-202}, {0x25b,0x25b,-1,-203}, -- {0x260,0x260,-1,-205}, {0x263,0x263,-1,-207}, {0x268,0x268,-1,-209}, -- {0x269,0x26f,6,-211}, {0x272,0x272,-1,-213}, {0x275,0x275,-1,-214}, -- {0x280,0x283,3,-218}, {0x288,0x288,-1,-218}, {0x28a,0x28b,1,-217}, -- {0x292,0x292,-1,-219}, {0x3ac,0x3ac,-1,-38}, {0x3ad,0x3af,1,-37}, -- {0x3b1,0x3c1,1,-32}, {0x3c2,0x3c2,-1,-31}, {0x3c3,0x3cb,1,-32}, -- {0x3cc,0x3cc,-1,-64}, {0x3cd,0x3ce,1,-63}, {0x3d0,0x3d0,-1,-62}, -- {0x3d1,0x3d1,-1,-57}, {0x3d5,0x3d5,-1,-47}, {0x3d6,0x3d6,-1,-54}, -- {0x3d9,0x3ef,2,-1}, {0x3f0,0x3f0,-1,-86}, {0x3f1,0x3f1,-1,-80}, -- {0x3f2,0x3f2,-1,7}, {0x3f5,0x3f5,-1,-96}, {0x3f8,0x3fb,3,-1}, -- {0x430,0x44f,1,-32}, {0x450,0x45f,1,-80}, {0x461,0x481,2,-1}, -- {0x48b,0x4bf,2,-1}, {0x4c2,0x4ce,2,-1}, {0x4d1,0x4f5,2,-1}, -- {0x4f9,0x501,8,-1}, {0x503,0x50f,2,-1}, {0x561,0x586,1,-48}, -- {0x1e01,0x1e95,2,-1}, {0x1e9b,0x1e9b,-1,-59}, {0x1ea1,0x1ef9,2,-1}, -- {0x1f00,0x1f07,1,8}, {0x1f10,0x1f15,1,8}, {0x1f20,0x1f27,1,8}, -- {0x1f30,0x1f37,1,8}, {0x1f40,0x1f45,1,8}, {0x1f51,0x1f57,2,8}, -- {0x1f60,0x1f67,1,8}, {0x1f70,0x1f71,1,74}, {0x1f72,0x1f75,1,86}, -- {0x1f76,0x1f77,1,100}, {0x1f78,0x1f79,1,128}, {0x1f7a,0x1f7b,1,112}, -- {0x1f7c,0x1f7d,1,126}, {0x1f80,0x1f87,1,8}, {0x1f90,0x1f97,1,8}, -- {0x1fa0,0x1fa7,1,8}, {0x1fb0,0x1fb1,1,8}, {0x1fb3,0x1fb3,-1,9}, -- {0x1fbe,0x1fbe,-1,-7205}, {0x1fc3,0x1fc3,-1,9}, {0x1fd0,0x1fd1,1,8}, -- {0x1fe0,0x1fe1,1,8}, {0x1fe5,0x1fe5,-1,7}, {0x1ff3,0x1ff3,-1,9}, -- {0xff41,0xff5a,1,-32}, {0x10428,0x1044f,1,-40} -+ {0x61,0x7a,1,-32}, -+ {0xb5,0xb5,-1,743}, -+ {0xe0,0xf6,1,-32}, -+ {0xf8,0xfe,1,-32}, -+ {0xff,0xff,-1,121}, -+ {0x101,0x12f,2,-1}, -+ {0x131,0x131,-1,-232}, -+ {0x133,0x137,2,-1}, -+ {0x13a,0x148,2,-1}, -+ {0x14b,0x177,2,-1}, -+ {0x17a,0x17e,2,-1}, -+ {0x17f,0x17f,-1,-300}, -+ {0x180,0x180,-1,195}, -+ {0x183,0x185,2,-1}, -+ {0x188,0x18c,4,-1}, -+ {0x192,0x192,-1,-1}, -+ {0x195,0x195,-1,97}, -+ {0x199,0x199,-1,-1}, -+ {0x19a,0x19a,-1,163}, -+ {0x19e,0x19e,-1,130}, -+ {0x1a1,0x1a5,2,-1}, -+ {0x1a8,0x1ad,5,-1}, -+ {0x1b0,0x1b4,4,-1}, -+ {0x1b6,0x1b9,3,-1}, -+ {0x1bd,0x1bd,-1,-1}, -+ {0x1bf,0x1bf,-1,56}, -+ {0x1c5,0x1c5,-1,-1}, -+ {0x1c6,0x1c6,-1,-2}, -+ {0x1c8,0x1c8,-1,-1}, -+ {0x1c9,0x1c9,-1,-2}, -+ {0x1cb,0x1cb,-1,-1}, -+ {0x1cc,0x1cc,-1,-2}, -+ {0x1ce,0x1dc,2,-1}, -+ {0x1dd,0x1dd,-1,-79}, -+ {0x1df,0x1ef,2,-1}, -+ {0x1f2,0x1f2,-1,-1}, -+ {0x1f3,0x1f3,-1,-2}, -+ {0x1f5,0x1f9,4,-1}, -+ {0x1fb,0x21f,2,-1}, -+ {0x223,0x233,2,-1}, -+ {0x23c,0x23c,-1,-1}, -+ {0x23f,0x240,1,10815}, -+ {0x242,0x247,5,-1}, -+ {0x249,0x24f,2,-1}, -+ {0x250,0x250,-1,10783}, -+ {0x251,0x251,-1,10780}, -+ {0x252,0x252,-1,10782}, -+ {0x253,0x253,-1,-210}, -+ {0x254,0x254,-1,-206}, -+ {0x256,0x257,1,-205}, -+ {0x259,0x259,-1,-202}, -+ {0x25b,0x25b,-1,-203}, -+ {0x260,0x260,-1,-205}, -+ {0x263,0x263,-1,-207}, -+ {0x268,0x268,-1,-209}, -+ {0x269,0x269,-1,-211}, -+ {0x26b,0x26b,-1,10743}, -+ {0x26f,0x26f,-1,-211}, -+ {0x271,0x271,-1,10749}, -+ {0x272,0x272,-1,-213}, -+ {0x275,0x275,-1,-214}, -+ {0x27d,0x27d,-1,10727}, -+ {0x280,0x283,3,-218}, -+ {0x288,0x288,-1,-218}, -+ {0x289,0x289,-1,-69}, -+ {0x28a,0x28b,1,-217}, -+ {0x28c,0x28c,-1,-71}, -+ {0x292,0x292,-1,-219}, -+ {0x345,0x345,-1,84}, -+ {0x371,0x373,2,-1}, -+ {0x377,0x377,-1,-1}, -+ {0x37b,0x37d,1,130}, -+ {0x3ac,0x3ac,-1,-38}, -+ {0x3ad,0x3af,1,-37}, -+ {0x3b1,0x3c1,1,-32}, -+ {0x3c2,0x3c2,-1,-31}, -+ {0x3c3,0x3cb,1,-32}, -+ {0x3cc,0x3cc,-1,-64}, -+ {0x3cd,0x3ce,1,-63}, -+ {0x3d0,0x3d0,-1,-62}, -+ {0x3d1,0x3d1,-1,-57}, -+ {0x3d5,0x3d5,-1,-47}, -+ {0x3d6,0x3d6,-1,-54}, -+ {0x3d7,0x3d7,-1,-8}, -+ {0x3d9,0x3ef,2,-1}, -+ {0x3f0,0x3f0,-1,-86}, -+ {0x3f1,0x3f1,-1,-80}, -+ {0x3f2,0x3f2,-1,7}, -+ {0x3f5,0x3f5,-1,-96}, -+ {0x3f8,0x3fb,3,-1}, -+ {0x430,0x44f,1,-32}, -+ {0x450,0x45f,1,-80}, -+ {0x461,0x481,2,-1}, -+ {0x48b,0x4bf,2,-1}, -+ {0x4c2,0x4ce,2,-1}, -+ {0x4cf,0x4cf,-1,-15}, -+ {0x4d1,0x525,2,-1}, -+ {0x561,0x586,1,-48}, -+ {0x1d79,0x1d79,-1,35332}, -+ {0x1d7d,0x1d7d,-1,3814}, -+ {0x1e01,0x1e95,2,-1}, -+ {0x1e9b,0x1e9b,-1,-59}, -+ {0x1ea1,0x1eff,2,-1}, -+ {0x1f00,0x1f07,1,8}, -+ {0x1f10,0x1f15,1,8}, -+ {0x1f20,0x1f27,1,8}, -+ {0x1f30,0x1f37,1,8}, -+ {0x1f40,0x1f45,1,8}, -+ {0x1f51,0x1f57,2,8}, -+ {0x1f60,0x1f67,1,8}, -+ {0x1f70,0x1f71,1,74}, -+ {0x1f72,0x1f75,1,86}, -+ {0x1f76,0x1f77,1,100}, -+ {0x1f78,0x1f79,1,128}, -+ {0x1f7a,0x1f7b,1,112}, -+ {0x1f7c,0x1f7d,1,126}, -+ {0x1f80,0x1f87,1,8}, -+ {0x1f90,0x1f97,1,8}, -+ {0x1fa0,0x1fa7,1,8}, -+ {0x1fb0,0x1fb1,1,8}, -+ {0x1fb3,0x1fb3,-1,9}, -+ {0x1fbe,0x1fbe,-1,-7205}, -+ {0x1fc3,0x1fc3,-1,9}, -+ {0x1fd0,0x1fd1,1,8}, -+ {0x1fe0,0x1fe1,1,8}, -+ {0x1fe5,0x1fe5,-1,7}, -+ {0x1ff3,0x1ff3,-1,9}, -+ {0x214e,0x214e,-1,-28}, -+ {0x2170,0x217f,1,-16}, -+ {0x2184,0x2184,-1,-1}, -+ {0x24d0,0x24e9,1,-26}, -+ {0x2c30,0x2c5e,1,-48}, -+ {0x2c61,0x2c61,-1,-1}, -+ {0x2c65,0x2c65,-1,-10795}, -+ {0x2c66,0x2c66,-1,-10792}, -+ {0x2c68,0x2c6c,2,-1}, -+ {0x2c73,0x2c76,3,-1}, -+ {0x2c81,0x2ce3,2,-1}, -+ {0x2cec,0x2cee,2,-1}, -+ {0x2d00,0x2d25,1,-7264}, -+ {0xa641,0xa65f,2,-1}, -+ {0xa663,0xa66d,2,-1}, -+ {0xa681,0xa697,2,-1}, -+ {0xa723,0xa72f,2,-1}, -+ {0xa733,0xa76f,2,-1}, -+ {0xa77a,0xa77c,2,-1}, -+ {0xa77f,0xa787,2,-1}, -+ {0xa78c,0xa78c,-1,-1}, -+ {0xff41,0xff5a,1,-32}, -+ {0x10428,0x1044f,1,-40} - }; - - /* - * Return the upper-case equivalent of "a", which is a UCS-4 character. Use - * simple case folding. -@@ -2415,17 +3186,17 @@ show_utf8() - } - - /* - * mb_head_off() function pointer. - * Return offset from "p" to the first byte of the character it points into. -+ * If "p" points to the NUL at the end of the string return 0. - * Returns 0 when already at the first byte of a character. - */ --/*ARGSUSED*/ - int - latin_head_off(base, p) -- char_u *base; -- char_u *p; -+ char_u *base UNUSED; -+ char_u *p UNUSED; - { - return 0; - } - - int -@@ -2435,11 +3206,11 @@ dbcs_head_off(base, p) - { - char_u *q; - - /* It can't be a trailing byte when not using DBCS, at the start of the - * string or the previous byte can't start a double-byte. */ -- if (p <= base || MB_BYTE2LEN(p[-1]) == 1) -+ if (p <= base || MB_BYTE2LEN(p[-1]) == 1 || *p == NUL) - return 0; - - /* This is slow: need to start at the base and go forward until the - * byte we are looking for. Return 1 when we went past it, 0 otherwise. */ - q = base; -@@ -2463,11 +3234,12 @@ dbcs_screen_head_off(base, p) - * string or the previous byte can't start a double-byte. - * For euc-jp an 0x8e byte in the previous cell always means we have a - * lead byte in the current cell. */ - if (p <= base - || (enc_dbcs == DBCS_JPNU && p[-1] == 0x8e) -- || MB_BYTE2LEN(p[-1]) == 1) -+ || MB_BYTE2LEN(p[-1]) == 1 -+ || *p == NUL) - return 0; - - /* This is slow: need to start at the base and go forward until the - * byte we are looking for. Return 1 when we went past it, 0 otherwise. - * For DBCS_JPNU look out for 0x8e, which means the second byte is not -@@ -2489,10 +3261,11 @@ utf_head_off(base, p) - char_u *p; - { - char_u *q; - char_u *s; - int c; -+ int len; - #ifdef FEAT_ARABIC - char_u *j; - #endif - - if (*p < 0x80) /* be quick for ASCII */ -@@ -2508,12 +3281,12 @@ utf_head_off(base, p) - /* Move q to the first byte of this char. */ - while (q > base && (*q & 0xc0) == 0x80) - --q; - /* Check for illegal sequence. Do allow an illegal byte after where we - * started. */ -- if (utf8len_tab[*q] != (int)(s - q + 1) -- && utf8len_tab[*q] != (int)(p - q + 1)) -+ len = utf8len_tab[*q]; -+ if (len != (int)(s - q + 1) && len != (int)(p - q + 1)) - return 0; - - if (q <= base) - break; - -@@ -2538,11 +3311,10 @@ utf_head_off(base, p) - } - - return (int)(p - q); - } - --#if defined(FEAT_EVAL) || defined(PROTO) - /* - * Copy a character from "*fp" to "*tp" and advance the pointers. - */ - void - mb_copy_char(fp, tp) -@@ -2553,11 +3325,10 @@ mb_copy_char(fp, tp) - - mch_memmove(*tp, *fp, (size_t)l); - *tp += l; - *fp += l; - } --#endif - - /* - * Return the offset from "p" to the first byte of a character. When "p" is - * at the start of a character 0 is returned, otherwise the offset to the next - * character. Can start anywhere in a stream of bytes. -@@ -2723,13 +3494,13 @@ utf_valid_string(s, end) - int l; - char_u *p = s; - - while (end == NULL ? *p != NUL : p < end) - { -- if ((*p & 0xc0) == 0x80) -+ l = utf8len_tab_zero[*p]; -+ if (l == 0) - return FALSE; /* invalid lead byte */ -- l = utf8len_tab[*p]; - if (end != NULL && p + l > end) - return FALSE; /* incomplete byte sequence */ - ++p; - while (--l > 0) - if ((*p++ & 0xc0) != 0x80) -@@ -3131,11 +3902,11 @@ enc_locale() - s = buf + 10; - } - else - s = p + 1; - } -- for (i = 0; s[i] != NUL && s + i < buf + sizeof(buf) - 1; ++i) -+ for (i = 0; s[i] != NUL && i < (int)sizeof(buf) - 1; ++i) - { - if (s[i] == '_' || s[i] == '-') - buf[i] = '-'; - else if (isalnum((int)s[i])) - buf[i] = TOLOWER_ASC(s[i]); -@@ -3178,11 +3949,11 @@ encname2codepage(name) - } - #endif - - # if defined(USE_ICONV) || defined(PROTO) - --static char_u *iconv_string __ARGS((vimconv_T *vcp, char_u *str, int slen, int *unconvlenp)); -+static char_u *iconv_string __ARGS((vimconv_T *vcp, char_u *str, int slen, int *unconvlenp, int *resultlenp)); - - /* - * Call iconv_open() with a check if iconv() works properly (there are broken - * versions). - * Returns (void *)-1 if failed. -@@ -3239,17 +4010,19 @@ my_iconv_open(to, from) - /* - * Convert the string "str[slen]" with iconv(). - * If "unconvlenp" is not NULL handle the string ending in an incomplete - * sequence and set "*unconvlenp" to the length of it. - * Returns the converted string in allocated memory. NULL for an error. -+ * If resultlenp is not NULL, sets it to the result length in bytes. - */ - static char_u * --iconv_string(vcp, str, slen, unconvlenp) -+iconv_string(vcp, str, slen, unconvlenp, resultlenp) - vimconv_T *vcp; - char_u *str; - int slen; - int *unconvlenp; -+ int *resultlenp; - { - const char *from; - size_t fromlen; - char *to; - size_t tolen; -@@ -3331,10 +4104,13 @@ iconv_string(vcp, str, slen, unconvlenp) - break; - } - /* Not enough room or skipping illegal sequence. */ - done = to - (char *)result; - } -+ -+ if (resultlenp != NULL) -+ *resultlenp = (int)(to - (char *)result); - return result; - } - - # if defined(DYNAMIC_ICONV) || defined(PROTO) - /* -@@ -3582,13 +4358,14 @@ im_show_info(void) - - /* - * Callback invoked when the user finished preediting. - * Put the final string into the input buffer. - */ --/*ARGSUSED0*/ - static void --im_commit_cb(GtkIMContext *context, const gchar *str, gpointer data) -+im_commit_cb(GtkIMContext *context UNUSED, -+ const gchar *str, -+ gpointer data UNUSED) - { - int slen = (int)STRLEN(str); - int add_to_input = TRUE; - int clen; - int len = slen; -@@ -3670,13 +4447,12 @@ im_commit_cb(GtkIMContext *context, cons - } - - /* - * Callback invoked after start to the preedit. - */ --/*ARGSUSED*/ - static void --im_preedit_start_cb(GtkIMContext *context, gpointer data) -+im_preedit_start_cb(GtkIMContext *context UNUSED, gpointer data UNUSED) - { - #ifdef XIM_DEBUG - xim_log("im_preedit_start_cb()\n"); - #endif - -@@ -3687,13 +4463,12 @@ im_preedit_start_cb(GtkIMContext *contex - } - - /* - * Callback invoked after end to the preedit. - */ --/*ARGSUSED*/ - static void --im_preedit_end_cb(GtkIMContext *context, gpointer data) -+im_preedit_end_cb(GtkIMContext *context UNUSED, gpointer data UNUSED) - { - #ifdef XIM_DEBUG - xim_log("im_preedit_end_cb()\n"); - #endif - im_delete_preedit(); -@@ -3748,13 +4523,12 @@ im_preedit_end_cb(GtkIMContext *context, - * at the receiving end of the queue. This, however, would have a rather large - * impact on the code base. If there is an easy way to force processing of all - * remaining input from within the "retrieve_surrounding" signal handler, this - * might not be necessary. Gotta ask on vim-dev for opinions. - */ --/*ARGSUSED1*/ - static void --im_preedit_changed_cb(GtkIMContext *context, gpointer data) -+im_preedit_changed_cb(GtkIMContext *context, gpointer data UNUSED) - { - char *preedit_string = NULL; - int cursor_index = 0; - int num_move_back = 0; - char_u *str; -@@ -4616,15 +5390,14 @@ xim_set_focus(focus) - #endif - } - } - } - --/*ARGSUSED*/ - void - im_set_position(row, col) -- int row; -- int col; -+ int row UNUSED; -+ int col UNUSED; - { - xim_set_preedit(); - } - - /* -@@ -4927,16 +5700,15 @@ static int xim_real_init __ARGS((Window - - #ifdef USE_X11R6_XIM - static void xim_instantiate_cb __ARGS((Display *display, XPointer client_data, XPointer call_data)); - static void xim_destroy_cb __ARGS((XIM im, XPointer client_data, XPointer call_data)); - --/*ARGSUSED*/ - static void - xim_instantiate_cb(display, client_data, call_data) - Display *display; -- XPointer client_data; -- XPointer call_data; -+ XPointer client_data UNUSED; -+ XPointer call_data UNUSED; - { - Window x11_window; - Display *x11_display; - - #ifdef XIM_DEBUG -@@ -4952,16 +5724,15 @@ xim_instantiate_cb(display, client_data, - if (xic != NULL) - XUnregisterIMInstantiateCallback(x11_display, NULL, NULL, NULL, - xim_instantiate_cb, NULL); - } - --/*ARGSUSED*/ - static void - xim_destroy_cb(im, client_data, call_data) -- XIM im; -- XPointer client_data; -- XPointer call_data; -+ XIM im UNUSED; -+ XPointer client_data UNUSED; -+ XPointer call_data UNUSED; - { - Window x11_window; - Display *x11_display; - - #ifdef XIM_DEBUG -@@ -5276,13 +6047,14 @@ xim_decide_input_style() - supported_style &= ~(int)GDK_IM_STATUS_AREA; - xim_input_style = (int)gdk_im_decide_style((GdkIMStyle)supported_style); - } - } - --/*ARGSUSED*/ - static void --preedit_start_cbproc(XIC xic, XPointer client_data, XPointer call_data) -+preedit_start_cbproc(XIC thexic UNUSED, -+ XPointer client_data UNUSED, -+ XPointer call_data UNUSED) - { - #ifdef XIM_DEBUG - xim_log("xim_decide_input_style()\n"); - #endif - -@@ -5310,13 +6082,14 @@ xim_back_delete(int n) - } - - static GSList *key_press_event_queue = NULL; - static gboolean processing_queued_event = FALSE; - --/*ARGSUSED*/ - static void --preedit_draw_cbproc(XIC xic, XPointer client_data, XPointer call_data) -+preedit_draw_cbproc(XIC thexic UNUSED, -+ XPointer client_data UNUSED, -+ XPointer call_data) - { - XIMPreeditDrawCallbackStruct *draw_data; - XIMText *text; - char *src; - GSList *event_queue; -@@ -5384,11 +6157,11 @@ preedit_draw_cbproc(XIC xic, XPointer cl - { - if (draw_feedback == NULL) - draw_feedback = (char *)alloc(draw_data->chg_first - + text->length); - else -- draw_feedback = realloc(draw_feedback, -+ draw_feedback = vim_realloc(draw_feedback, - draw_data->chg_first + text->length); - if (draw_feedback != NULL) - { - draw_feedback[nfeedback + draw_data->chg_first] - = draw_data->text->feedback[nfeedback]; -@@ -5451,22 +6224,24 @@ im_get_feedback_attr(int col) - } - - return -1; - } - --/*ARGSUSED*/ - static void --preedit_caret_cbproc(XIC xic, XPointer client_data, XPointer call_data) -+preedit_caret_cbproc(XIC thexic UNUSED, -+ XPointer client_data UNUSED, -+ XPointer call_data UNUSED) - { - #ifdef XIM_DEBUG - xim_log("preedit_caret_cbproc()\n"); - #endif - } - --/*ARGSUSED*/ - static void --preedit_done_cbproc(XIC xic, XPointer client_data, XPointer call_data) -+preedit_done_cbproc(XIC thexic UNUSED, -+ XPointer client_data UNUSED, -+ XPointer call_data UNUSED) - { - #ifdef XIM_DEBUG - xim_log("preedit_done_cbproc()\n"); - #endif - -@@ -5501,13 +6276,12 @@ xim_reset(void) - if (text != NULL) - XFree(text); - } - } - --/*ARGSUSED*/ - int --xim_queue_key_press_event(GdkEventKey *event, int down) -+xim_queue_key_press_event(GdkEventKey *event, int down UNUSED) - { - #ifdef XIM_DEBUG - xim_log("xim_queue_key_press_event()\n"); - #endif - -@@ -5519,13 +6293,12 @@ xim_queue_key_press_event(GdkEventKey *e - key_press_event_queue = g_slist_append(key_press_event_queue, - gdk_event_copy((GdkEvent *)event)); - return TRUE; - } - --/*ARGSUSED*/ - static void --preedit_callback_setup(GdkIC *ic) -+preedit_callback_setup(GdkIC *ic UNUSED) - { - XIC xxic; - XVaNestedList preedit_attr; - XIMCallback preedit_start_cb; - XIMCallback preedit_draw_cb; -@@ -5546,13 +6319,12 @@ preedit_callback_setup(GdkIC *ic) - NULL); - XSetICValues(xxic, XNPreeditAttributes, preedit_attr, NULL); - XFree(preedit_attr); - } - --/*ARGSUSED*/ - static void --reset_state_setup(GdkIC *ic) -+reset_state_setup(GdkIC *ic UNUSED) - { - #ifdef USE_X11R6_XIM - /* don't change the input context when we call reset */ - XSetICValues(((GdkICPrivate *)ic)->xic, XNResetState, XIMPreserveState, - NULL); -@@ -5754,12 +6526,29 @@ im_is_preediting() - convert_setup(vcp, from, to) - vimconv_T *vcp; - char_u *from; - char_u *to; - { -+ return convert_setup_ext(vcp, from, TRUE, to, TRUE); -+} -+ -+/* -+ * As convert_setup(), but only when from_unicode_is_utf8 is TRUE will all -+ * "from" unicode charsets be considered utf-8. Same for "to". -+ */ -+ int -+convert_setup_ext(vcp, from, from_unicode_is_utf8, to, to_unicode_is_utf8) -+ vimconv_T *vcp; -+ char_u *from; -+ int from_unicode_is_utf8; -+ char_u *to; -+ int to_unicode_is_utf8; -+{ - int from_prop; - int to_prop; -+ int from_is_utf8; -+ int to_is_utf8; - - /* Reset to no conversion. */ - # ifdef USE_ICONV - if (vcp->vc_type == CONV_ICONV && vcp->vc_fd != (iconv_t)-1) - iconv_close(vcp->vc_fd); -@@ -5773,69 +6562,78 @@ convert_setup(vcp, from, to) - || STRCMP(from, to) == 0) - return OK; - - from_prop = enc_canon_props(from); - to_prop = enc_canon_props(to); -- if ((from_prop & ENC_LATIN1) && (to_prop & ENC_UNICODE)) -+ if (from_unicode_is_utf8) -+ from_is_utf8 = from_prop & ENC_UNICODE; -+ else -+ from_is_utf8 = from_prop == ENC_UNICODE; -+ if (to_unicode_is_utf8) -+ to_is_utf8 = to_prop & ENC_UNICODE; -+ else -+ to_is_utf8 = to_prop == ENC_UNICODE; -+ -+ if ((from_prop & ENC_LATIN1) && to_is_utf8) - { - /* Internal latin1 -> utf-8 conversion. */ - vcp->vc_type = CONV_TO_UTF8; - vcp->vc_factor = 2; /* up to twice as long */ - } -- else if ((from_prop & ENC_LATIN9) && (to_prop & ENC_UNICODE)) -+ else if ((from_prop & ENC_LATIN9) && to_is_utf8) - { - /* Internal latin9 -> utf-8 conversion. */ - vcp->vc_type = CONV_9_TO_UTF8; - vcp->vc_factor = 3; /* up to three as long (euro sign) */ - } -- else if ((from_prop & ENC_UNICODE) && (to_prop & ENC_LATIN1)) -+ else if (from_is_utf8 && (to_prop & ENC_LATIN1)) - { - /* Internal utf-8 -> latin1 conversion. */ - vcp->vc_type = CONV_TO_LATIN1; - } -- else if ((from_prop & ENC_UNICODE) && (to_prop & ENC_LATIN9)) -+ else if (from_is_utf8 && (to_prop & ENC_LATIN9)) - { - /* Internal utf-8 -> latin9 conversion. */ - vcp->vc_type = CONV_TO_LATIN9; - } - #ifdef WIN3264 - /* Win32-specific codepage <-> codepage conversion without iconv. */ -- else if (((from_prop & ENC_UNICODE) || encname2codepage(from) > 0) -- && ((to_prop & ENC_UNICODE) || encname2codepage(to) > 0)) -+ else if ((from_is_utf8 || encname2codepage(from) > 0) -+ && (to_is_utf8 || encname2codepage(to) > 0)) - { - vcp->vc_type = CONV_CODEPAGE; - vcp->vc_factor = 2; /* up to twice as long */ -- vcp->vc_cpfrom = (from_prop & ENC_UNICODE) ? 0 : encname2codepage(from); -- vcp->vc_cpto = (to_prop & ENC_UNICODE) ? 0 : encname2codepage(to); -+ vcp->vc_cpfrom = from_is_utf8 ? 0 : encname2codepage(from); -+ vcp->vc_cpto = to_is_utf8 ? 0 : encname2codepage(to); - } - #endif - #ifdef MACOS_X - else if ((from_prop & ENC_MACROMAN) && (to_prop & ENC_LATIN1)) - { - vcp->vc_type = CONV_MAC_LATIN1; - } -- else if ((from_prop & ENC_MACROMAN) && (to_prop & ENC_UNICODE)) -+ else if ((from_prop & ENC_MACROMAN) && to_is_utf8) - { - vcp->vc_type = CONV_MAC_UTF8; - vcp->vc_factor = 2; /* up to twice as long */ - } - else if ((from_prop & ENC_LATIN1) && (to_prop & ENC_MACROMAN)) - { - vcp->vc_type = CONV_LATIN1_MAC; - } -- else if ((from_prop & ENC_UNICODE) && (to_prop & ENC_MACROMAN)) -+ else if (from_is_utf8 && (to_prop & ENC_MACROMAN)) - { - vcp->vc_type = CONV_UTF8_MAC; - } - #endif - # ifdef USE_ICONV - else - { - /* Use iconv() for conversion. */ - vcp->vc_fd = (iconv_t)my_iconv_open( -- (to_prop & ENC_UNICODE) ? (char_u *)"utf-8" : to, -- (from_prop & ENC_UNICODE) ? (char_u *)"utf-8" : from); -+ to_is_utf8 ? (char_u *)"utf-8" : to, -+ from_is_utf8 ? (char_u *)"utf-8" : from); - if (vcp->vc_fd != (iconv_t)-1) - { - vcp->vc_type = CONV_ICONV; - vcp->vc_factor = 4; /* could be longer too... */ - } -@@ -6003,16 +6801,24 @@ string_convert_ext(vcp, ptr, lenp, uncon - if (retval == NULL) - break; - d = retval; - for (i = 0; i < len; ++i) - { -- l = utf_ptr2len(ptr + i); -+ l = utf_ptr2len_len(ptr + i, len - i); - if (l == 0) - *d++ = NUL; - else if (l == 1) - { -- if (unconvlenp != NULL && utf8len_tab[ptr[i]] > len - i) -+ int l_w = utf8len_tab_zero[ptr[i]]; -+ -+ if (l_w == 0) -+ { -+ /* Illegal utf-8 byte cannot be converted */ -+ vim_free(retval); -+ return NULL; -+ } -+ if (unconvlenp != NULL && l_w > len - i) - { - /* Incomplete sequence at the end. */ - *unconvlenp = len - i; - break; - } -@@ -6087,13 +6893,11 @@ string_convert_ext(vcp, ptr, lenp, uncon - break; - # endif - - # ifdef USE_ICONV - case CONV_ICONV: /* conversion with output_conv.vc_fd */ -- retval = iconv_string(vcp, ptr, len, unconvlenp); -- if (retval != NULL && lenp != NULL) -- *lenp = (int)STRLEN(retval); -+ retval = iconv_string(vcp, ptr, len, unconvlenp, lenp); - break; - # endif - # ifdef WIN3264 - case CONV_CODEPAGE: /* codepage -> codepage */ - { -@@ -6101,33 +6905,33 @@ string_convert_ext(vcp, ptr, lenp, uncon - int tmp_len; - short_u *tmp; - - /* 1. codepage/UTF-8 -> ucs-2. */ - if (vcp->vc_cpfrom == 0) -- tmp_len = utf8_to_ucs2(ptr, len, NULL, NULL); -+ tmp_len = utf8_to_utf16(ptr, len, NULL, NULL); - else - tmp_len = MultiByteToWideChar(vcp->vc_cpfrom, 0, - ptr, len, 0, 0); - tmp = (short_u *)alloc(sizeof(short_u) * tmp_len); - if (tmp == NULL) - break; - if (vcp->vc_cpfrom == 0) -- utf8_to_ucs2(ptr, len, tmp, unconvlenp); -+ utf8_to_utf16(ptr, len, tmp, unconvlenp); - else - MultiByteToWideChar(vcp->vc_cpfrom, 0, ptr, len, tmp, tmp_len); - - /* 2. ucs-2 -> codepage/UTF-8. */ - if (vcp->vc_cpto == 0) -- retlen = ucs2_to_utf8(tmp, tmp_len, NULL); -+ retlen = utf16_to_utf8(tmp, tmp_len, NULL); - else - retlen = WideCharToMultiByte(vcp->vc_cpto, 0, - tmp, tmp_len, 0, 0, 0, 0); - retval = alloc(retlen + 1); - if (retval != NULL) - { - if (vcp->vc_cpto == 0) -- ucs2_to_utf8(tmp, tmp_len, retval); -+ utf16_to_utf8(tmp, tmp_len, retval); - else - WideCharToMultiByte(vcp->vc_cpto, 0, - tmp, tmp_len, retval, retlen, 0, 0); - retval[retlen] = NUL; - if (lenp != NULL) ---- vim72.orig/src/memfile.c -+++ vim72/src/memfile.c -@@ -1341,10 +1341,15 @@ mf_do_open(mfp, fname, flags) - mfp->mf_fname = NULL; - mfp->mf_ffname = NULL; - } - else - { -+#ifdef HAVE_FD_CLOEXEC -+ int fdflags = fcntl(mfp->mf_fd, F_GETFD); -+ if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0) -+ fcntl(mfp->mf_fd, F_SETFD, fdflags | FD_CLOEXEC); -+#endif - #ifdef HAVE_SELINUX - mch_copy_sec(fname, mfp->mf_fname); - #endif - mch_hide(mfp->mf_fname); /* try setting the 'hidden' flag */ - } ---- vim72.orig/src/memline.c -+++ vim72/src/memline.c -@@ -380,11 +380,11 @@ ml_open(buf) - - dp = (DATA_BL *)(hp->bh_data); - dp->db_index[0] = --dp->db_txt_start; /* at end of block */ - dp->db_free -= 1 + INDEX_SIZE; - dp->db_line_count = 1; -- *((char_u *)dp + dp->db_txt_start) = NUL; /* emtpy line */ -+ *((char_u *)dp + dp->db_txt_start) = NUL; /* empty line */ - - return OK; - - error: - if (mfp != NULL) -@@ -488,10 +488,17 @@ ml_setname(buf) - { - /* could not (re)open the swap file, what can we do???? */ - EMSG(_("E301: Oops, lost the swap file!!!")); - return; - } -+#ifdef HAVE_FD_CLOEXEC -+ { -+ int fdflags = fcntl(mfp->mf_fd, F_GETFD); -+ if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0) -+ fcntl(mfp->mf_fd, F_SETFD, fdflags | FD_CLOEXEC); -+ } -+#endif - } - if (!success) - EMSG(_("E302: Could not rename swap file")); - } - -@@ -862,25 +869,28 @@ ml_recover() - int attr; - - recoverymode = TRUE; - called_from_main = (curbuf->b_ml.ml_mfp == NULL); - attr = hl_attr(HLF_E); --/* -- * If the file name ends in ".sw?" we use it directly. -- * Otherwise a search is done to find the swap file(s). -- */ -+ -+ /* -+ * If the file name ends in ".s[uvw][a-z]" we assume this is the swap file. -+ * Otherwise a search is done to find the swap file(s). -+ */ - fname = curbuf->b_fname; - if (fname == NULL) /* When there is no file name */ - fname = (char_u *)""; - len = (int)STRLEN(fname); - if (len >= 4 && - #if defined(VMS) || defined(RISCOS) -- STRNICMP(fname + len - 4, "_sw" , 3) -+ STRNICMP(fname + len - 4, "_s" , 2) - #else -- STRNICMP(fname + len - 4, ".sw" , 3) -+ STRNICMP(fname + len - 4, ".s" , 2) - #endif -- == 0) -+ == 0 -+ && vim_strchr((char_u *)"UVWuvw", fname[len - 2]) != NULL -+ && ASCII_ISALPHA(fname[len - 1])) - { - directly = TRUE; - fname = vim_strsave(fname); /* make a copy for mf_open() */ - } - else -@@ -1280,22 +1290,23 @@ ml_recover() - } - - for (i = 0; i < dp->db_line_count; ++i) - { - txt_start = (dp->db_index[i] & DB_INDEX_MASK); -- if (txt_start <= HEADER_SIZE -+ if (txt_start <= (int)HEADER_SIZE - || txt_start >= (int)dp->db_txt_end) - { - p = (char_u *)"???"; - ++error; - } - else - p = (char_u *)dp + txt_start; - ml_append(lnum++, p, (colnr_T)0, TRUE); - } - if (has_error) -- ml_append(lnum++, (char_u *)_("???END"), (colnr_T)0, TRUE); -+ ml_append(lnum++, (char_u *)_("???END"), -+ (colnr_T)0, TRUE); - } - } - } - - if (buf->b_ml.ml_stack_top == 0) /* finished */ -@@ -1552,14 +1563,19 @@ recover_names(fname, list, nr) - && (p = curbuf->b_ml.ml_mfp->mf_fname) != NULL) - { - for (i = 0; i < num_files; ++i) - if (fullpathcmp(p, files[i], TRUE) & FPC_SAME) - { -+ /* Remove the name from files[i]. Move further entries -+ * down. When the array becomes empty free it here, since -+ * FreeWild() won't be called below. */ - vim_free(files[i]); -- --num_files; -- for ( ; i < num_files; ++i) -- files[i] = files[i + 1]; -+ if (--num_files == 0) -+ vim_free(files); -+ else -+ for ( ; i < num_files; ++i) -+ files[i] = files[i + 1]; - } - } - if (nr > 0) - { - file_count += num_files; -@@ -2095,16 +2111,16 @@ errorret: - lnum = 1; - - if (buf->b_ml.ml_mfp == NULL) /* there are no lines */ - return (char_u *)""; - --/* -- * See if it is the same line as requested last time. -- * Otherwise may need to flush last used line. -- * Don't use the last used line when 'swapfile' is reset, need to load all -- * blocks. -- */ -+ /* -+ * See if it is the same line as requested last time. -+ * Otherwise may need to flush last used line. -+ * Don't use the last used line when 'swapfile' is reset, need to load all -+ * blocks. -+ */ - if (buf->b_ml.ml_line_lnum != lnum || mf_dont_release) - { - ml_flush_line(buf); - - /* -@@ -3069,16 +3085,23 @@ ml_flush_line(buf) - int extra; - int idx; - int start; - int count; - int i; -+ static int entered = FALSE; - - if (buf->b_ml.ml_line_lnum == 0 || buf->b_ml.ml_mfp == NULL) - return; /* nothing to do */ - - if (buf->b_ml.ml_flags & ML_LINE_DIRTY) - { -+ /* This code doesn't work recursively, but Netbeans may call back here -+ * when obtaining the cursor position. */ -+ if (entered) -+ return; -+ entered = TRUE; -+ - lnum = buf->b_ml.ml_line_lnum; - new_line = buf->b_ml.ml_line_ptr; - - hp = ml_find_line(buf, lnum, ML_FIND); - if (hp == NULL) -@@ -3142,10 +3165,12 @@ ml_flush_line(buf) - (dp->db_index[idx] & DB_MARKED)); - (void)ml_delete_int(buf, lnum, FALSE); - } - } - vim_free(new_line); -+ -+ entered = FALSE; - } - - buf->b_ml.ml_line_lnum = 0; - } - -@@ -3520,11 +3545,11 @@ resolve_symlink(fname, buf) - if (ret <= 0) - { - if (errno == EINVAL || errno == ENOENT) - { - /* Found non-symlink or not existing file, stop here. -- * When at the first level use the unmodifed name, skip the -+ * When at the first level use the unmodified name, skip the - * call to vim_FullName(). */ - if (depth == 1) - return FAIL; - - /* Use the resolved name in tmp[]. */ -@@ -3566,15 +3591,14 @@ resolve_symlink(fname, buf) - - /* - * Make swap file name out of the file name and a directory name. - * Returns pointer to allocated memory or NULL. - */ --/*ARGSUSED*/ - char_u * - makeswapname(fname, ffname, buf, dir_name) - char_u *fname; -- char_u *ffname; -+ char_u *ffname UNUSED; - buf_T *buf; - char_u *dir_name; - { - char_u *r, *s; - #ifdef HAVE_READLINK -@@ -3764,12 +3788,14 @@ do_swapexists(buf, fname) - { - set_vim_var_string(VV_SWAPNAME, fname, -1); - set_vim_var_string(VV_SWAPCHOICE, NULL, -1); - - /* Trigger SwapExists autocommands with <afile> set to the file being -- * edited. */ -+ * edited. Disallow changing directory here. */ -+ ++allbuf_lock; - apply_autocmds(EVENT_SWAPEXISTS, buf->b_fname, NULL, FALSE, NULL); -+ --allbuf_lock; - - set_vim_var_string(VV_SWAPNAME, NULL, -1); - - switch (*get_vim_var_str(VV_SWAPCHOICE)) - { -@@ -3791,10 +3817,11 @@ do_swapexists(buf, fname) - * Several names are tried to find one that does not exist - * Returns the name in allocated memory or NULL. - * - * Note: If BASENAMELEN is not correct, you will get error messages for - * not being able to open the swapfile -+ * Note: May trigger SwapExists autocmd, pointers may change! - */ - static char_u * - findswapname(buf, dirp, old_fname) - buf_T *buf; - char_u **dirp; /* pointer to list of directories */ -@@ -4558,11 +4585,11 @@ ml_updatechunk(buf, line, len, updtype) - - mch_memmove(buf->b_ml.ml_chunksize + curix + 1, - buf->b_ml.ml_chunksize + curix, - (buf->b_ml.ml_usedchunks - curix) * - sizeof(chunksize_T)); -- /* Compute length of first half of lines in the splitted chunk */ -+ /* Compute length of first half of lines in the split chunk */ - size = 0; - linecnt = 0; - while (curline < buf->b_ml.ml_line_count - && linecnt < MLCS_MINL) - { ---- vim72.orig/src/menu.c -+++ vim72/src/menu.c -@@ -229,19 +229,19 @@ ex_menu(eap) - if (STRNCMP(menu_path, "BuiltIn", 7) == 0) - { - if (skipdigits(menu_path + 7) == p) - { - menuarg.iconidx = atoi((char *)menu_path + 7); -- if (menuarg.iconidx >= TOOLBAR_NAME_COUNT) -+ if (menuarg.iconidx >= (int)TOOLBAR_NAME_COUNT) - menuarg.iconidx = -1; - else - menuarg.icon_builtin = TRUE; - } - } - else - { -- for (i = 0; i < TOOLBAR_NAME_COUNT; ++i) -+ for (i = 0; i < (int)TOOLBAR_NAME_COUNT; ++i) - if (STRNCMP(toolbar_names[i], menu_path, p - menu_path) - == 0) - { - menuarg.iconidx = i; - break; -@@ -1118,10 +1118,11 @@ show_menus(path_name, modes) - } - name = p; - parent = menu; - menu = menu->children; - } -+ vim_free(path_name); - - /* Now we have found the matching menu, and we list the mappings */ - /* Highlight title */ - MSG_PUTS_TITLE(_("\n--- Menus ---")); - -@@ -1338,14 +1339,13 @@ set_context_in_menu_cmd(xp, cmd, arg, fo - - /* - * Function given to ExpandGeneric() to obtain the list of (sub)menus (not - * entries). - */ --/*ARGSUSED*/ - char_u * - get_menu_name(xp, idx) -- expand_T *xp; -+ expand_T *xp UNUSED; - int idx; - { - static vimmenu_T *menu = NULL; - char_u *str; - -@@ -1375,14 +1375,13 @@ get_menu_name(xp, idx) - - /* - * Function given to ExpandGeneric() to obtain the list of menus and menu - * entries. - */ --/*ARGSUSED*/ - char_u * - get_menu_names(xp, idx) -- expand_T *xp; -+ expand_T *xp UNUSED; - int idx; - { - static vimmenu_T *menu = NULL; - static char_u tbuffer[256]; /*hack*/ - char_u *str; -@@ -1736,14 +1735,13 @@ menu_is_hidden(name) - #if defined(FEAT_CMDL_COMPL) \ - || (defined(FEAT_GUI_W32) && defined(FEAT_TEAROFF)) - /* - * Return TRUE if the menu is the tearoff menu. - */ --/*ARGSUSED*/ - static int - menu_is_tearoff(name) -- char_u *name; -+ char_u *name UNUSED; - { - #ifdef FEAT_GUI - return (STRCMP(name, TEAR_STRING) == 0); - #else - return FALSE; -@@ -2340,14 +2338,13 @@ static garray_T menutrans_ga = {0, 0, 0, - /* - * ":menutrans". - * This function is also defined without the +multi_lang feature, in which - * case the commands are ignored. - */ --/*ARGSUSED*/ - void - ex_menutranslate(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - #ifdef FEAT_MULTI_LANG - char_u *arg = eap->arg; - menutrans_T *tp; - int i; ---- vim72.orig/src/message.c -+++ vim72/src/message.c -@@ -105,11 +105,11 @@ msg(s) - { - return msg_attr_keep(s, 0, FALSE); - } - - #if defined(FEAT_EVAL) || defined(FEAT_X11) || defined(USE_XSMP) \ -- || defined(PROTO) -+ || defined(FEAT_GUI_GTK) || defined(PROTO) - /* - * Like msg() but keep it silent when 'verbosefile' is set. - */ - int - verb_msg(s) -@@ -816,14 +816,13 @@ delete_first_msg() - } - - /* - * ":messages" command. - */ --/*ARGSUSED*/ - void - ex_messages(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - struct msg_hist *p; - char_u *s; - - msg_hist_off = TRUE; -@@ -974,11 +973,11 @@ wait_return(redraw) - c = K_IGNORE; - hit_return_msg(); - } - } - else if (msg_scrolled > Rows - 2 -- && (c == 'j' || c == K_DOWN || c == 'd')) -+ && (c == 'j' || c == K_DOWN || c == 'd' || c == 'f')) - c = K_IGNORE; - } - } while ((had_got_int && c == Ctrl_C) - || c == K_IGNORE - #ifdef FEAT_GUI -@@ -2502,23 +2501,24 @@ do_more_prompt(typed_char) - case K_DOWN: - scroll = 1; - break; - - case 'u': /* Up half a page */ -- case K_PAGEUP: - scroll = -(Rows / 2); - break; - - case 'd': /* Down half a page */ - scroll = Rows / 2; - break; - - case 'b': /* one page back */ -+ case K_PAGEUP: - scroll = -(Rows - 1); - break; - - case ' ': /* one extra page */ -+ case 'f': - case K_PAGEDOWN: - case K_LEFTMOUSE: - scroll = Rows - 1; - break; - -@@ -2550,18 +2550,20 @@ do_more_prompt(typed_char) - #ifdef FEAT_CON_DIALOG - if (confirm_msg_used) - { - /* Jump to the choices of the dialog. */ - retval = TRUE; -- lines_left = Rows - 1; - } - else - #endif - { - got_int = TRUE; - quit_more = TRUE; - } -+ /* When there is some more output (wrapping line) display that -+ * without another prompt. */ -+ lines_left = Rows - 1; - break; - - #ifdef FEAT_CLIPBOARD - case Ctrl_Y: - /* Strange way to allow copying (yanking) a modeless -@@ -3018,15 +3020,11 @@ redir_write(str, maxlen) - * Must come before the rest because of updating "msg_col". - */ - if (*p_vfile != NUL) - verbose_write(s, maxlen); - -- if (redir_fd != NULL --#ifdef FEAT_EVAL -- || redir_reg || redir_vname --#endif -- ) -+ if (redirecting()) - { - /* If the string doesn't start with CR or NL, go to msg_col */ - if (*s != '\n' && *s != '\r') - { - while (cur_col < msg_col) -@@ -3069,10 +3067,20 @@ redir_write(str, maxlen) - if (msg_silent != 0) /* should update msg_col */ - msg_col = cur_col; - } - } - -+ int -+redirecting() -+{ -+ return redir_fd != NULL -+#ifdef FEAT_EVAL -+ || redir_reg || redir_vname -+#endif -+ ; -+} -+ - /* - * Before giving verbose message. - * Must always be called paired with verbose_leave()! - */ - void -@@ -3279,19 +3287,19 @@ msg_advance(col) - * The second button should be the 'Cancel' button - * Other buttons- use your imagination! - * A '&' in a button name becomes a shortcut, so each '&' should be before a - * different letter. - */ --/* ARGSUSED */ - int - do_dialog(type, title, message, buttons, dfltbutton, textfield) -- int type; -- char_u *title; -+ int type UNUSED; -+ char_u *title UNUSED; - char_u *message; - char_u *buttons; - int dfltbutton; -- char_u *textfield; /* IObuff for inputdialog(), NULL otherwise */ -+ char_u *textfield UNUSED; /* IObuff for inputdialog(), NULL -+ otherwise */ - { - int oldState; - int retval = 0; - char_u *hotkeys; - int c; -@@ -3307,11 +3315,14 @@ do_dialog(type, title, message, buttons, - /* When GUI is running and 'c' not in 'guioptions', use the GUI dialog */ - if (gui.in_use && vim_strchr(p_go, GO_CONDIALOG) == NULL) - { - c = gui_mch_dialog(type, title, message, buttons, dfltbutton, - textfield); -- msg_end_prompt(); -+ /* avoid a hit-enter prompt without clearing the cmdline */ -+ need_wait_return = FALSE; -+ emsg_on_display = FALSE; -+ cmdline_row = msg_row; - - /* Flush output to avoid that further messages and redrawing is done - * in the wrong order. */ - out_flush(); - gui_mch_update(); -@@ -4007,11 +4018,11 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3 - while (*p != NUL) - { - if (*p != '%') - { - char *q = strchr(p + 1, '%'); -- size_t n = (q == NULL) ? STRLEN(p) : (q - p); -+ size_t n = (q == NULL) ? STRLEN(p) : (size_t)(q - p); - - /* Copy up to the next '%' or NUL without any changes. */ - if (str_l < str_m) - { - size_t avail = str_m - str_l; -@@ -4254,11 +4265,12 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3 - /* memchr on HP does not like n > 2^31 !!! */ - char *q = memchr(str_arg, '\0', - precision <= (size_t)0x7fffffffL ? precision - : (size_t)0x7fffffffL); - #endif -- str_arg_l = (q == NULL) ? precision : q - str_arg; -+ str_arg_l = (q == NULL) ? precision -+ : (size_t)(q - str_arg); - } - break; - - default: - break; -@@ -4354,11 +4366,12 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3 - uint_arg = - #ifndef HAVE_STDARG_H - get_a_arg(arg_idx); - #else - # if defined(FEAT_EVAL) -- tvs != NULL ? tv_nr(tvs, &arg_idx) : -+ tvs != NULL ? (unsigned) -+ tv_nr(tvs, &arg_idx) : - # endif - va_arg(ap, unsigned int); - #endif - if (uint_arg != 0) - arg_sign = 1; -@@ -4367,11 +4380,12 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3 - ulong_arg = - #ifndef HAVE_STDARG_H - get_a_arg(arg_idx); - #else - # if defined(FEAT_EVAL) -- tvs != NULL ? tv_nr(tvs, &arg_idx) : -+ tvs != NULL ? (unsigned long) -+ tv_nr(tvs, &arg_idx) : - # endif - va_arg(ap, unsigned long int); - #endif - if (ulong_arg != 0) - arg_sign = 1; -@@ -4554,11 +4568,17 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3 - else - fmt_spec = fmt_spec == 'g' ? 'e' : 'E'; - remove_trailing_zeroes = TRUE; - } - -- if (fmt_spec == 'f' && abs_f > 1.0e307) -+ if (fmt_spec == 'f' && -+#ifdef VAX -+ abs_f > 1.0e38 -+#else -+ abs_f > 1.0e307 -+#endif -+ ) - { - /* Avoid a buffer overflow */ - strcpy(tmp, "inf"); - str_arg_l = 3; - } -@@ -4583,65 +4603,66 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3 - str_arg_l = sprintf(tmp, format, f); - - if (remove_trailing_zeroes) - { - int i; -- char *p; -+ char *tp; - - /* Using %g or %G: remove superfluous zeroes. */ - if (fmt_spec == 'f') -- p = tmp + str_arg_l - 1; -+ tp = tmp + str_arg_l - 1; - else - { -- p = (char *)vim_strchr((char_u *)tmp, -+ tp = (char *)vim_strchr((char_u *)tmp, - fmt_spec == 'e' ? 'e' : 'E'); -- if (p != NULL) -+ if (tp != NULL) - { - /* Remove superfluous '+' and leading - * zeroes from the exponent. */ -- if (p[1] == '+') -+ if (tp[1] == '+') - { - /* Change "1.0e+07" to "1.0e07" */ -- STRMOVE(p + 1, p + 2); -+ STRMOVE(tp + 1, tp + 2); - --str_arg_l; - } -- i = (p[1] == '-') ? 2 : 1; -- while (p[i] == '0') -+ i = (tp[1] == '-') ? 2 : 1; -+ while (tp[i] == '0') - { - /* Change "1.0e07" to "1.0e7" */ -- STRMOVE(p + i, p + i + 1); -+ STRMOVE(tp + i, tp + i + 1); - --str_arg_l; - } -- --p; -+ --tp; - } - } - -- if (p != NULL && !precision_specified) -+ if (tp != NULL && !precision_specified) - /* Remove trailing zeroes, but keep the one - * just after a dot. */ -- while (p > tmp + 2 && *p == '0' && p[-1] != '.') -+ while (tp > tmp + 2 && *tp == '0' -+ && tp[-1] != '.') - { -- STRMOVE(p, p + 1); -- --p; -+ STRMOVE(tp, tp + 1); -+ --tp; - --str_arg_l; - } - } - else - { -- char *p; -+ char *tp; - - /* Be consistent: some printf("%e") use 1.0e+12 - * and some 1.0e+012. Remove one zero in the last - * case. */ -- p = (char *)vim_strchr((char_u *)tmp, -+ tp = (char *)vim_strchr((char_u *)tmp, - fmt_spec == 'e' ? 'e' : 'E'); -- if (p != NULL && (p[1] == '+' || p[1] == '-') -- && p[2] == '0' -- && vim_isdigit(p[3]) -- && vim_isdigit(p[4])) -+ if (tp != NULL && (tp[1] == '+' || tp[1] == '-') -+ && tp[2] == '0' -+ && vim_isdigit(tp[3]) -+ && vim_isdigit(tp[4])) - { -- STRMOVE(p + 2, p + 3); -+ STRMOVE(tp + 2, tp + 3); - --str_arg_l; - } - } - } - str_arg = tmp; -@@ -4683,11 +4704,12 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3 - if (str_l < str_m) - { - size_t avail = str_m - str_l; - - vim_memset(str + str_l, zero_padding ? '0' : ' ', -- (size_t)pn > avail ? avail : pn); -+ (size_t)pn > avail ? avail -+ : (size_t)pn); - } - str_l += pn; - } - } - -@@ -4710,11 +4732,12 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3 - if (str_l < str_m) - { - size_t avail = str_m - str_l; - - mch_memmove(str + str_l, str_arg, -- (size_t)zn > avail ? avail : zn); -+ (size_t)zn > avail ? avail -+ : (size_t)zn); - } - str_l += zn; - } - - /* insert zero padding as requested by the precision or min -@@ -4725,11 +4748,12 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3 - if (str_l < str_m) - { - size_t avail = str_m-str_l; - - vim_memset(str + str_l, '0', -- (size_t)zn > avail ? avail : zn); -+ (size_t)zn > avail ? avail -+ : (size_t)zn); - } - str_l += zn; - } - } - -@@ -4744,11 +4768,11 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3 - { - size_t avail = str_m - str_l; - - mch_memmove(str + str_l, - str_arg + zero_padding_insertion_ind, -- (size_t)sn > avail ? avail : sn); -+ (size_t)sn > avail ? avail : (size_t)sn); - } - str_l += sn; - } - } - -@@ -4764,11 +4788,12 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3 - if (str_l < str_m) - { - size_t avail = str_m - str_l; - - vim_memset(str + str_l, ' ', -- (size_t)pn > avail ? avail : pn); -+ (size_t)pn > avail ? avail -+ : (size_t)pn); - } - str_l += pn; - } - } - } ---- vim72.orig/src/misc1.c -+++ vim72/src/misc1.c -@@ -1024,16 +1024,18 @@ open_line(dir, flags, old_indent) - if (lead_repl != NULL) - { - int c = 0; - int off = 0; - -- for (p = lead_flags; *p && *p != ':'; ++p) -+ for (p = lead_flags; *p != NUL && *p != ':'; ) - { - if (*p == COM_RIGHT || *p == COM_LEFT) -- c = *p; -+ c = *p++; - else if (VIM_ISDIGIT(*p) || *p == '-') - off = getdigits(&p); -+ else -+ ++p; - } - if (c == COM_RIGHT) /* right adjusted leader */ - { - /* find last non-white in the leader to line up with */ - for (p = leader + lead_len - 1; p > leader -@@ -1117,11 +1119,11 @@ open_line(dir, flags, old_indent) - break; - } - if (i != lead_repl_len) - { - mch_memmove(p + lead_repl_len, p + i, -- (size_t)(lead_len - i - (leader - p))); -+ (size_t)(lead_len - i - (p - leader))); - lead_len += lead_repl_len - i; - } - } - #endif - mch_memmove(p, lead_repl, (size_t)lead_repl_len); -@@ -2186,16 +2188,15 @@ del_chars(count, fixpos) - * If "fixpos" is TRUE, don't leave the cursor on the NUL after the line. - * Caller must have prepared for undo. - * - * return FAIL for failure, OK otherwise - */ --/*ARGSUSED*/ - int - del_bytes(count, fixpos_arg, use_delcombine) - long count; - int fixpos_arg; -- int use_delcombine; /* 'delcombine' option applies */ -+ int use_delcombine UNUSED; /* 'delcombine' option applies */ - { - char_u *oldp, *newp; - colnr_T oldlen; - linenr_T lnum = curwin->w_cursor.lnum; - colnr_T col = curwin->w_cursor.col; -@@ -2344,35 +2345,39 @@ truncate_line(fixpos) - del_lines(nlines, undo) - long nlines; /* number of lines to delete */ - int undo; /* if TRUE, prepare for undo */ - { - long n; -+ linenr_T first = curwin->w_cursor.lnum; - - if (nlines <= 0) - return; - - /* save the deleted lines for undo */ -- if (undo && u_savedel(curwin->w_cursor.lnum, nlines) == FAIL) -+ if (undo && u_savedel(first, nlines) == FAIL) - return; - - for (n = 0; n < nlines; ) - { - if (curbuf->b_ml.ml_flags & ML_EMPTY) /* nothing to delete */ - break; - -- ml_delete(curwin->w_cursor.lnum, TRUE); -+ ml_delete(first, TRUE); - ++n; - - /* If we delete the last line in the file, stop */ -- if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count) -+ if (first > curbuf->b_ml.ml_line_count) - break; - } -- /* adjust marks, mark the buffer as changed and prepare for displaying */ -- deleted_lines_mark(curwin->w_cursor.lnum, n); - -+ /* Correct the cursor position before calling deleted_lines_mark(), it may -+ * trigger a callback to display the cursor. */ - curwin->w_cursor.col = 0; - check_cursor_lnum(); -+ -+ /* adjust marks, mark the buffer as changed and prepare for displaying */ -+ deleted_lines_mark(first, n); - } - - int - gchar_pos(pos) - pos_T *pos; -@@ -2620,10 +2625,12 @@ deleted_lines(lnum, count) - changed_lines(lnum, 0, lnum + count, -count); - } - - /* - * Like deleted_lines(), but adjust marks first. -+ * Make sure the cursor is on a valid line before calling, a GUI callback may -+ * be triggered to display the cursor. - */ - void - deleted_lines_mark(lnum, count) - linenr_T lnum; - long count; -@@ -2715,10 +2722,13 @@ changed_common(lnum, col, lnume, xtra) - colnr_T col; - linenr_T lnume; - long xtra; - { - win_T *wp; -+#ifdef FEAT_WINDOWS -+ tabpage_T *tp; -+#endif - int i; - #ifdef FEAT_JUMPLIST - int cols; - pos_T *p; - int add; -@@ -2767,19 +2777,19 @@ changed_common(lnum, col, lnume, xtra) - { - /* changelist is full: remove oldest entry */ - curbuf->b_changelistlen = JUMPLISTSIZE - 1; - mch_memmove(curbuf->b_changelist, curbuf->b_changelist + 1, - sizeof(pos_T) * (JUMPLISTSIZE - 1)); -- FOR_ALL_WINDOWS(wp) -+ FOR_ALL_TAB_WINDOWS(tp, wp) - { - /* Correct position in changelist for other windows on - * this buffer. */ - if (wp->w_buffer == curbuf && wp->w_changelistidx > 0) - --wp->w_changelistidx; - } - } -- FOR_ALL_WINDOWS(wp) -+ FOR_ALL_TAB_WINDOWS(tp, wp) - { - /* For other windows, if the position in the changelist is - * at the end it stays at the end. */ - if (wp->w_buffer == curbuf - && wp->w_changelistidx == curbuf->b_changelistlen) -@@ -2794,11 +2804,11 @@ changed_common(lnum, col, lnume, xtra) - * takes you back to it. */ - curwin->w_changelistidx = curbuf->b_changelistlen; - #endif - } - -- FOR_ALL_WINDOWS(wp) -+ FOR_ALL_TAB_WINDOWS(tp, wp) - { - if (wp->w_buffer == curbuf) - { - /* Mark this window to be redrawn later. */ - if (wp->w_redr_type < VALID) -@@ -2876,10 +2886,17 @@ changed_common(lnum, col, lnume, xtra) - * may need to be redrawn */ - wp->w_lines[i].wl_valid = FALSE; - } - #endif - } -+ -+#ifdef FEAT_FOLDING -+ /* Take care of side effects for setting w_topline when folds have -+ * changed. Esp. when the buffer was changed in another window. */ -+ if (hasAnyFolding(wp)) -+ set_topline(wp, wp->w_topline); -+#endif - } - } - - /* Call update_screen() later, which checks out what needs to be redrawn, - * since it notices b_mod_set and then uses b_mod_*. */ -@@ -2953,10 +2970,12 @@ check_status(buf) - void - change_warning(col) - int col; /* column for message; non-zero when in insert - mode and 'showmode' is on */ - { -+ static char *w_readonly = N_("W10: Warning: Changing a readonly file"); -+ - if (curbuf->b_did_warn == FALSE - && curbufIsChanged() == 0 - #ifdef FEAT_AUTOCMD - && !autocmd_busy - #endif -@@ -2975,12 +2994,14 @@ change_warning(col) - */ - msg_start(); - if (msg_row == Rows - 1) - msg_col = col; - msg_source(hl_attr(HLF_W)); -- MSG_PUTS_ATTR(_("W10: Warning: Changing a readonly file"), -- hl_attr(HLF_W) | MSG_HIST); -+ MSG_PUTS_ATTR(_(w_readonly), hl_attr(HLF_W) | MSG_HIST); -+#ifdef FEAT_EVAL -+ set_vim_var_string(VV_WARNINGMSG, (char_u *)_(w_readonly), -1); -+#endif - msg_clr_eos(); - (void)msg_end(); - if (msg_silent == 0 && !silent_mode) - { - out_flush(); -@@ -3243,13 +3264,13 @@ prompt_for_number(mouse_used) - int save_cmdline_row; - int save_State; - - /* When using ":silent" assume that <CR> was entered. */ - if (mouse_used != NULL) -- MSG_PUTS(_("Type number or click with mouse (<Enter> cancels): ")); -+ MSG_PUTS(_("Type number and <Enter> or click with mouse (empty cancels): ")); - else -- MSG_PUTS(_("Choice number (<Enter> cancels): ")); -+ MSG_PUTS(_("Type number and <Enter> (empty cancels): ")); - - /* Set the state such that text can be selected/copied/pasted and we still - * get mouse events. */ - save_cmdline_row = cmdline_row; - cmdline_row = 0; -@@ -3262,10 +3283,11 @@ prompt_for_number(mouse_used) - /* don't call wait_return() now */ - /* msg_putchar('\n'); */ - cmdline_row = msg_row - 1; - need_wait_return = FALSE; - msg_didany = FALSE; -+ msg_didout = FALSE; - } - else - cmdline_row = save_cmdline_row; - State = save_State; - -@@ -3446,11 +3468,13 @@ init_homedir() - { - char_u *homedrive, *homepath; - - homedrive = mch_getenv((char_u *)"HOMEDRIVE"); - homepath = mch_getenv((char_u *)"HOMEPATH"); -- if (homedrive != NULL && homepath != NULL -+ if (homepath == NULL || *homepath == NUL) -+ homepath = "\\"; -+ if (homedrive != NULL - && STRLEN(homedrive) + STRLEN(homepath) < MAXPATHL) - { - sprintf((char *)NameBuff, "%s%s", homedrive, homepath); - if (NameBuff[0] != NUL) - { -@@ -4139,14 +4163,13 @@ vim_setenv(name, val) - - #if defined(FEAT_CMDL_COMPL) || defined(PROTO) - /* - * Function given to ExpandGeneric() to obtain an environment variable name. - */ --/*ARGSUSED*/ - char_u * - get_env_name(xp, idx) -- expand_T *xp; -+ expand_T *xp UNUSED; - int idx; - { - # if defined(AMIGA) || defined(__MRC__) || defined(__SC__) - /* - * No environ[] on the Amiga and on the Mac (using MPW). -@@ -4643,11 +4666,10 @@ concat_fnames(fname1, fname2, sep) - STRCAT(dest, fname2); - } - return dest; - } - --#if defined(FEAT_EVAL) || defined(FEAT_GETTEXT) || defined(PROTO) - /* - * Concatenate two strings and return the result in allocated memory. - * Returns NULL when out of memory. - */ - char_u * -@@ -4664,11 +4686,10 @@ concat_str(str1, str2) - STRCPY(dest, str1); - STRCPY(dest + l, str2); - } - return dest; - } --#endif - - /* - * Add a path separator to a file name, unless it already ends in a path - * separator. - */ -@@ -4734,13 +4755,13 @@ find_start_comment(ind_maxcomment) / - /* - * Check if the comment start we found is inside a string. - * If it is then restrict the search to below this line and try again. - */ - line = ml_get(pos->lnum); -- for (p = line; *p && (unsigned)(p - line) < pos->col; ++p) -+ for (p = line; *p && (colnr_T)(p - line) < pos->col; ++p) - p = skip_string(p); -- if ((unsigned)(p - line) <= pos->col) -+ if ((colnr_T)(p - line) <= pos->col) - break; - cur_maxcomment = curwin->w_cursor.lnum - pos->lnum - 1; - if (cur_maxcomment <= 0) - { - pos = NULL; -@@ -6247,10 +6268,12 @@ get_c_indent() - case 'h': ind_scopedecl_code = n; break; - case 'j': ind_java = n; break; - case 'l': ind_keep_case_label = n; break; - case '#': ind_hash_comment = n; break; - } -+ if (*options == ',') -+ ++options; - } - - /* remember where the cursor was when we started */ - cur_curpos = curwin->w_cursor; - -@@ -6267,11 +6290,11 @@ get_c_indent() - * inserting new stuff. - * For unknown reasons the cursor might be past the end of the line, thus - * check for that. - */ - if ((State & INSERT) -- && curwin->w_cursor.col < STRLEN(linecopy) -+ && curwin->w_cursor.col < (colnr_T)STRLEN(linecopy) - && linecopy[curwin->w_cursor.col] == ')') - linecopy[curwin->w_cursor.col] = NUL; - - theline = skipwhite(linecopy); - -@@ -7704,15 +7727,18 @@ term_again: - } - - /* - * If the NEXT line is a function declaration, the current - * line needs to be indented as a function type spec. -- * Don't do this if the current line looks like a comment -- * or if the current line is terminated, ie. ends in ';'. -+ * Don't do this if the current line looks like a comment or if the -+ * current line is terminated, ie. ends in ';', or if the current line -+ * contains { or }: "void f() {\n if (1)" - */ - else if (cur_curpos.lnum < curbuf->b_ml.ml_line_count - && !cin_nocode(theline) -+ && vim_strchr(theline, '{') == NULL -+ && vim_strchr(theline, '}') == NULL - && !cin_ends_in(theline, (char_u *)":", NULL) - && !cin_ends_in(theline, (char_u *)",", NULL) - && cin_isfuncdecl(NULL, cur_curpos.lnum + 1) - && !cin_isterminated(theline, FALSE, TRUE)) - { -@@ -8424,10 +8450,50 @@ fast_breakcheck() - ui_breakcheck(); - } - } - - /* -+ * Invoke expand_wildcards() for one pattern. -+ * Expand items like "%:h" before the expansion. -+ * Returns OK or FAIL. -+ */ -+ int -+expand_wildcards_eval(pat, num_file, file, flags) -+ char_u **pat; /* pointer to input pattern */ -+ int *num_file; /* resulting number of files */ -+ char_u ***file; /* array of resulting files */ -+ int flags; /* EW_DIR, etc. */ -+{ -+ int ret = FAIL; -+ char_u *eval_pat = NULL; -+ char_u *exp_pat = *pat; -+ char_u *ignored_msg; -+ int usedlen; -+ -+ if (*exp_pat == '%' || *exp_pat == '#' || *exp_pat == '<') -+ { -+ ++emsg_off; -+ eval_pat = eval_vars(exp_pat, exp_pat, &usedlen, -+ NULL, &ignored_msg, NULL); -+ --emsg_off; -+ if (eval_pat != NULL) -+ exp_pat = concat_str(eval_pat, exp_pat + usedlen); -+ } -+ -+ if (exp_pat != NULL) -+ ret = expand_wildcards(1, &exp_pat, num_file, file, flags); -+ -+ if (eval_pat != NULL) -+ { -+ vim_free(exp_pat); -+ vim_free(eval_pat); -+ } -+ -+ return ret; -+} -+ -+/* - * Expand wildcards. Calls gen_expand_wildcards() and removes files matching - * 'wildignore'. - * Returns OK or FAIL. - */ - int -@@ -8520,15 +8586,29 @@ match_suffix(fname) - fnamelen = (int)STRLEN(fname); - setsuflen = 0; - for (setsuf = p_su; *setsuf; ) - { - setsuflen = copy_option_part(&setsuf, suf_buf, MAXSUFLEN, ".,"); -- if (fnamelen >= setsuflen -- && fnamencmp(suf_buf, fname + fnamelen - setsuflen, -- (size_t)setsuflen) == 0) -- break; -- setsuflen = 0; -+ if (setsuflen == 0) -+ { -+ char_u *tail = gettail(fname); -+ -+ /* empty entry: match name without a '.' */ -+ if (vim_strchr(tail, '.') == NULL) -+ { -+ setsuflen = 1; -+ break; -+ } -+ } -+ else -+ { -+ if (fnamelen >= setsuflen -+ && fnamencmp(suf_buf, fname + fnamelen - setsuflen, -+ (size_t)setsuflen) == 0) -+ break; -+ setsuflen = 0; -+ } - } - return (setsuflen != 0); - } - - #if !defined(NO_EXPANDPATH) || defined(PROTO) -@@ -8726,11 +8806,11 @@ dos_expandpath( - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - { - /* The active codepage differs from 'encoding'. Attempt using the - * wide function. If it fails because it is not implemented fall back - * to the non-wide version (for Windows 98) */ -- wn = enc_to_ucs2(buf, NULL); -+ wn = enc_to_utf16(buf, NULL); - if (wn != NULL) - { - hFind = FindFirstFileW(wn, &wfb); - if (hFind == INVALID_HANDLE_VALUE - && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) -@@ -8754,11 +8834,11 @@ dos_expandpath( - while (ok) - { - #ifdef WIN3264 - # ifdef FEAT_MBYTE - if (wn != NULL) -- p = ucs2_to_enc(wfb.cFileName, NULL); /* p is allocated here */ -+ p = utf16_to_enc(wfb.cFileName, NULL); /* p is allocated here */ - else - # endif - p = (char_u *)fb.cFileName; - #else - p = (char_u *)fb.ff_name; -@@ -8828,11 +8908,11 @@ dos_expandpath( - FindClose(hFind); - # ifdef FEAT_MBYTE - if (wn != NULL) - { - vim_free(wn); -- wn = enc_to_ucs2(buf, NULL); -+ wn = enc_to_utf16(buf, NULL); - if (wn != NULL) - hFind = FindFirstFileW(wn, &wfb); - } - if (wn == NULL) - # endif -@@ -9186,11 +9266,11 @@ gen_expand_wildcards(num_pat, pat, num_f - * found file names and start all over again. - */ - else if (vim_strpbrk(p, (char_u *)"$~") != NULL) - { - vim_free(p); -- ga_clear(&ga); -+ ga_clear_strings(&ga); - i = mch_expand_wildcards(num_pat, pat, num_file, file, - flags); - recursive = FALSE; - return i; - } ---- vim72.orig/src/misc2.c -+++ vim72/src/misc2.c -@@ -154,11 +154,11 @@ coladvance2(pos, addspaces, finetune, wc - #endif - #ifdef FEAT_VIRTUALEDIT - || ((ve_flags & VE_ONEMORE) && wcol < MAXCOL) - #endif - ; -- line = ml_get_curline(); -+ line = ml_get_buf(curbuf, pos->lnum, FALSE); - - if (wcol >= MAXCOL) - { - idx = (int)STRLEN(line) - 1 + one_more; - col = wcol; -@@ -330,13 +330,13 @@ coladvance2(pos, addspaces, finetune, wc - } - } - #endif - - #ifdef FEAT_MBYTE -- /* prevent cursor from moving on the trail byte */ -+ /* prevent from moving onto a trail byte */ - if (has_mbyte) -- mb_adjust_cursor(); -+ mb_adjustpos(pos); - #endif - - if (col < wcol) - return FAIL; - return OK; -@@ -494,11 +494,12 @@ check_cursor_lnum() - void - check_cursor_col() - { - colnr_T len; - #ifdef FEAT_VIRTUALEDIT -- colnr_T oldcol = curwin->w_cursor.col + curwin->w_cursor.coladd; -+ colnr_T oldcol = curwin->w_cursor.col; -+ colnr_T oldcoladd = curwin->w_cursor.col + curwin->w_cursor.coladd; - #endif - - len = (colnr_T)STRLEN(ml_get_curline()); - if (len == 0) - curwin->w_cursor.col = 0; -@@ -525,19 +526,27 @@ check_cursor_col() - if (has_mbyte) - mb_adjust_cursor(); - #endif - } - } -+ else if (curwin->w_cursor.col < 0) -+ curwin->w_cursor.col = 0; - - #ifdef FEAT_VIRTUALEDIT - /* If virtual editing is on, we can leave the cursor on the old position, - * only we must set it to virtual. But don't do it when at the end of the - * line. */ - if (oldcol == MAXCOL) - curwin->w_cursor.coladd = 0; - else if (ve_flags == VE_ALL) -- curwin->w_cursor.coladd = oldcol - curwin->w_cursor.col; -+ { -+ if (oldcoladd > curwin->w_cursor.col) -+ curwin->w_cursor.coladd = oldcoladd - curwin->w_cursor.col; -+ else -+ /* avoid weird number when there is a miscalculation or overflow */ -+ curwin->w_cursor.coladd = 0; -+ } - #endif - } - - /* - * make sure curwin->w_cursor in on a valid character -@@ -871,11 +880,11 @@ lalloc(size, message) - allocated = 0; - # endif - /* 3. check for available memory: call mch_avail_mem() */ - if (mch_avail_mem(TRUE) < KEEP_ROOM && !releasing) - { -- vim_free((char *)p); /* System is low... no go! */ -+ free((char *)p); /* System is low... no go! */ - p = NULL; - } - else - goto theend; - #endif -@@ -996,22 +1005,30 @@ free_all_mem() - # endif - - # ifdef FEAT_MENU - /* Clear menus. */ - do_cmdline_cmd((char_u *)"aunmenu *"); -+# ifdef FEAT_MULTI_LANG -+ do_cmdline_cmd((char_u *)"menutranslate clear"); -+# endif - # endif - - /* Clear mappings, abbreviations, breakpoints. */ -+ do_cmdline_cmd((char_u *)"lmapclear"); -+ do_cmdline_cmd((char_u *)"xmapclear"); - do_cmdline_cmd((char_u *)"mapclear"); - do_cmdline_cmd((char_u *)"mapclear!"); - do_cmdline_cmd((char_u *)"abclear"); - # if defined(FEAT_EVAL) - do_cmdline_cmd((char_u *)"breakdel *"); - # endif - # if defined(FEAT_PROFILE) - do_cmdline_cmd((char_u *)"profdel *"); - # endif -+# if defined(FEAT_KEYMAP) -+ do_cmdline_cmd((char_u *)"set keymap="); -+#endif - - # ifdef FEAT_TITLE - free_titles(); - # endif - # if defined(FEAT_SEARCHPATH) -@@ -1032,10 +1049,13 @@ free_all_mem() - free_last_insert(); - free_prev_shellcmd(); - free_regexp_stuff(); - free_tag_stuff(); - free_cd_dir(); -+# ifdef FEAT_SIGNS -+ free_signs(); -+# endif - # ifdef FEAT_EVAL - set_expr_line(NULL); - # endif - # ifdef FEAT_DIFF - diff_clear(curtab); -@@ -1060,15 +1080,16 @@ free_all_mem() - init_history(); - # endif - - #ifdef FEAT_QUICKFIX - { -- win_T *win; -+ win_T *win; -+ tabpage_T *tab; - - qf_free_all(NULL); - /* Free all location lists */ -- FOR_ALL_WINDOWS(win) -+ FOR_ALL_TAB_WINDOWS(tab, win) - qf_free_all(win); - } - #endif - - /* Close all script inputs. */ -@@ -1255,25 +1276,22 @@ vim_strsave_escaped_ext(string, esc_char - *p2 = NUL; - } - return escaped_string; - } - --#if !defined(BACKSLASH_IN_FILENAME) || defined(FEAT_EVAL) || defined(PROTO) - /* - * Return TRUE when 'shell' has "csh" in the tail. - */ - int - csh_like_shell() - { - return (strstr((char *)gettail(p_sh), "csh") != NULL); - } --#endif - --#if defined(FEAT_EVAL) || defined(PROTO) - /* - * Escape "string" for use as a shell argument with system(). -- * This uses single quotes, except when we know we need to use double qoutes -+ * This uses single quotes, except when we know we need to use double quotes - * (MS-DOS and MS-Windows without 'shellslash' set). - * Escape a newline, depending on the 'shell' option. - * When "do_special" is TRUE also replace "!", "%", "#" and things starting - * with "<" like "<cfile>". - * Returns the result in allocated memory, NULL if we have run out. -@@ -1372,10 +1390,11 @@ vim_strsave_shellescape(string, do_speci - if (do_special && find_cmdline_var(p, &l) >= 0) - { - *d++ = '\\'; /* insert backslash */ - while (--l >= 0) /* copy the var */ - *d++ = *p++; -+ continue; - } - - MB_COPY_CHAR(p, d); - } - -@@ -1389,11 +1408,10 @@ vim_strsave_shellescape(string, do_speci - *d = NUL; - } - - return escaped_string; - } --#endif - - /* - * Like vim_strsave(), but make all characters uppercase. - * This uses ASCII lower-to-upper case translation, language independent. - */ -@@ -1525,11 +1543,11 @@ copy_spaces(ptr, count) - } - - #if defined(FEAT_VISUALEXTRA) || defined(PROTO) - /* - * Copy a character a number of times. -- * Does not work for multi-byte charactes! -+ * Does not work for multi-byte characters! - */ - void - copy_chars(ptr, count, c) - char_u *ptr; - size_t count; -@@ -2563,11 +2581,11 @@ trans_special(srcp, dst, keycode) - { - int modifiers = 0; - int key; - int dlen = 0; - -- key = find_special_key(srcp, &modifiers, keycode); -+ key = find_special_key(srcp, &modifiers, keycode, FALSE); - if (key == 0) - return 0; - - /* Put the appropriate modifier in a string */ - if (modifiers != 0) -@@ -2599,14 +2617,15 @@ trans_special(srcp, dst, keycode) - * Try translating a <> name at (*srcp)[], return the key and modifiers. - * srcp is advanced to after the <> name. - * returns 0 if there is no match. - */ - int --find_special_key(srcp, modp, keycode) -+find_special_key(srcp, modp, keycode, keep_x_key) - char_u **srcp; - int *modp; -- int keycode; /* prefer key code, e.g. K_DEL instead of DEL */ -+ int keycode; /* prefer key code, e.g. K_DEL instead of DEL */ -+ int keep_x_key; /* don't translate xHome to Home key */ - { - char_u *last_dash; - char_u *end_of_name; - char_u *src; - char_u *bp; -@@ -2670,11 +2689,12 @@ find_special_key(srcp, modp, keycode) - if (modifiers != 0 && last_dash[2] == '>') - key = last_dash[1]; - else - { - key = get_special_key_code(last_dash + 1); -- key = handle_x_keys(key); -+ if (!keep_x_key) -+ key = handle_x_keys(key); - } - - /* - * get_special_key_code() may return NUL for invalid - * special key name. -@@ -2827,11 +2847,11 @@ get_special_key_code(name) - #if defined(FEAT_CMDL_COMPL) || defined(PROTO) - char_u * - get_key_name(i) - int i; - { -- if (i >= KEY_NAMES_TABLE_LEN) -+ if (i >= (int)KEY_NAMES_TABLE_LEN) - return NULL; - return key_names_table[i].name; - } - #endif - -@@ -3855,11 +3875,12 @@ typedef struct ff_visited - #endif - /* for unix use inode etc for comparison (needed because of links), else - * use filename. - */ - #ifdef UNIX -- int ffv_dev; /* device number (-1 if not set) */ -+ int ffv_dev_valid; /* ffv_dev and ffv_ino were set */ -+ dev_t ffv_dev; /* device number */ - ino_t ffv_ino; /* inode number */ - #endif - /* The memory for this struct is allocated according to the length of - * ffv_fname. - */ -@@ -4045,17 +4066,16 @@ vim_findnext() - * must be NULL. - * - * This function silently ignores a few errors, vim_findfile() will have - * limited functionality then. - */ --/*ARGSUSED*/ - void * - vim_findfile_init(path, filename, stopdirs, level, free_visited, find_what, - search_ctx_arg, tagfile, rel_fname) - char_u *path; - char_u *filename; -- char_u *stopdirs; -+ char_u *stopdirs UNUSED; - int level; - int free_visited; - int find_what; - void *search_ctx_arg; - int tagfile; -@@ -4246,11 +4266,11 @@ vim_findfile_init(path, filename, stopdi - * The octet after a '**' is used as a (binary) counter. - * So '**3' is transposed to '**^C' ('^C' is ASCII value 3) - * or '**76' is transposed to '**N'( 'N' is ASCII value 76). - * For EBCDIC you get different character values. - * If no restrict is given after '**' the default is used. -- * Due to this technic the path looks awful if you print it as a -+ * Due to this technique the path looks awful if you print it as a - * string. - */ - len = 0; - while (*wc_part != NUL) - { -@@ -4635,11 +4655,11 @@ vim_findfile(search_ctx_arg) - { - if (!path_with_url(stackp->ffs_filearray[i]) - && !mch_isdir(stackp->ffs_filearray[i])) - continue; /* not a directory */ - -- /* prepare the filename to be checked for existance -+ /* prepare the filename to be checked for existence - * below */ - STRCPY(file_path, stackp->ffs_filearray[i]); - add_pathsep(file_path); - STRCAT(file_path, search_ctx->ffsc_file_to_search); - -@@ -4696,11 +4716,12 @@ vim_findfile(search_ctx_arg) - - /* push dir to examine rest of subdirs later */ - stackp->ffs_filearray_cur = i + 1; - ff_push(search_ctx, stackp); - -- simplify_filename(file_path); -+ if (!path_with_url(file_path)) -+ simplify_filename(file_path); - if (mch_dirname(ff_expand_buffer, MAXPATHL) - == OK) - { - p = shorten_fname(file_path, - ff_expand_buffer); -@@ -5048,14 +5069,13 @@ ff_check_visited(visited_list, fname - /* check against list of already visited files */ - for (vp = *visited_list; vp != NULL; vp = vp->ffv_next) - { - if ( - #ifdef UNIX -- !url -- ? (vp->ffv_dev == st.st_dev -- && vp->ffv_ino == st.st_ino) -- : -+ !url ? (vp->ffv_dev_valid && vp->ffv_dev == st.st_dev -+ && vp->ffv_ino == st.st_ino) -+ : - #endif - fnamecmp(vp->ffv_fname, ff_expand_buffer) == 0 - ) - { - #ifdef FEAT_PATH_EXTRA -@@ -5076,18 +5096,18 @@ ff_check_visited(visited_list, fname - if (vp != NULL) - { - #ifdef UNIX - if (!url) - { -+ vp->ffv_dev_valid = TRUE; - vp->ffv_ino = st.st_ino; - vp->ffv_dev = st.st_dev; - vp->ffv_fname[0] = NUL; - } - else - { -- vp->ffv_ino = 0; -- vp->ffv_dev = -1; -+ vp->ffv_dev_valid = FALSE; - #endif - STRCPY(vp->ffv_fname, ff_expand_buffer); - #ifdef UNIX - } - #endif -@@ -5424,11 +5444,11 @@ find_file_in_path_option(ptr, len, optio - /* "..", "../path", "." and "./path": don't use the path_option */ - || rel_to_curdir - #if defined(MSWIN) || defined(MSDOS) || defined(OS2) - /* handle "\tmp" as absolute path */ - || vim_ispathsep(ff_file_to_find[0]) -- /* handle "c:name" as absulute path */ -+ /* handle "c:name" as absolute path */ - || (ff_file_to_find[0] != NUL && ff_file_to_find[1] == ':') - #endif - #ifdef AMIGA - /* handle ":tmp" as absolute path */ - || ff_file_to_find[0] == ':' -@@ -5667,11 +5687,11 @@ qsort(base, elm_count, elm_size, cmp) - /* Compare the elements. */ - p1 = (char_u *)base + j * elm_size; - p2 = (char_u *)base + (j + gap) * elm_size; - if ((*cmp)((void *)p1, (void *)p2) <= 0) - break; -- /* Exchange the elemets. */ -+ /* Exchange the elements. */ - mch_memmove(buf, p1, elm_size); - mch_memmove(p1, p2, elm_size); - mch_memmove(p2, buf, elm_size); - } - ---- vim72.orig/src/move.c -+++ vim72/src/move.c -@@ -181,13 +181,10 @@ update_topline() - if (bufempty()) /* special case - file is empty */ - { - if (curwin->w_topline != 1) - redraw_later(NOT_VALID); - curwin->w_topline = 1; --#ifdef FEAT_DIFF -- curwin->w_topfill = 0; --#endif - curwin->w_botline = 2; - curwin->w_valid |= VALID_BOTLINE|VALID_BOTLINE_AP; - #ifdef FEAT_SCROLLBIND - curwin->w_scbind_pos = 1; - #endif -@@ -278,22 +275,24 @@ update_topline() - if (!(curwin->w_valid & VALID_BOTLINE_AP)) - validate_botline(); - - if (curwin->w_botline <= curbuf->b_ml.ml_line_count) - { -- if (curwin->w_cursor.lnum < curwin->w_botline -- && ((long)curwin->w_cursor.lnum -+ if (curwin->w_cursor.lnum < curwin->w_botline) -+ { -+ if (((long)curwin->w_cursor.lnum - >= (long)curwin->w_botline - p_so - #ifdef FEAT_FOLDING - || hasAnyFolding(curwin) - #endif - )) -- { -+ { - lineoff_T loff; - -- /* Cursor is above botline, check if there are 'scrolloff' -- * window lines below the cursor. If not, need to scroll. */ -+ /* Cursor is (a few lines) above botline, check if there are -+ * 'scrolloff' window lines below the cursor. If not, need to -+ * scroll. */ - n = curwin->w_empty_rows; - loff.lnum = curwin->w_cursor.lnum; - #ifdef FEAT_FOLDING - /* In a fold go to its last line. */ - (void)hasFolding(loff.lnum, NULL, &loff.lnum); -@@ -315,10 +314,14 @@ update_topline() - botline_forw(&loff); - } - if (n >= p_so) - /* sufficient context, no need to scroll */ - check_botline = FALSE; -+ } -+ else -+ /* sufficient context, no need to scroll */ -+ check_botline = FALSE; - } - if (check_botline) - { - #ifdef FEAT_FOLDING - if (hasAnyFolding(curwin)) -@@ -507,10 +510,13 @@ set_topline(wp, lnum) - (void)hasFoldingWin(wp, lnum, &lnum, NULL, TRUE, NULL); - #endif - /* Approximate the value of w_botline */ - wp->w_botline += lnum - wp->w_topline; - wp->w_topline = lnum; -+#ifdef FEAT_AUTOCMD -+ wp->w_topline_was_set = TRUE; -+#endif - #ifdef FEAT_DIFF - wp->w_topfill = 0; - #endif - wp->w_valid &= ~(VALID_WROW|VALID_CROW|VALID_BOTLINE|VALID_TOPLINE); - /* Don't set VALID_TOPLINE here, 'scrolloff' needs to be checked. */ -@@ -881,26 +887,26 @@ validate_cheight() - void - validate_cursor_col() - { - colnr_T off; - colnr_T col; -+ int width; - - validate_virtcol(); - if (!(curwin->w_valid & VALID_WCOL)) - { - col = curwin->w_virtcol; - off = curwin_col_off(); - col += off; -+ width = W_WIDTH(curwin) - off + curwin_col_off2(); - - /* long line wrapping, adjust curwin->w_wrow */ - if (curwin->w_p_wrap - && col >= (colnr_T)W_WIDTH(curwin) -- && W_WIDTH(curwin) - off + curwin_col_off2() > 0) -- { -- col -= W_WIDTH(curwin); -- col = col % (W_WIDTH(curwin) - off + curwin_col_off2()); -- } -+ && width > 0) -+ /* use same formula as what is used in curs_columns() */ -+ col -= ((col - W_WIDTH(curwin)) / width + 1) * width; - if (col > (int)curwin->w_leftcol) - col -= curwin->w_leftcol; - else - col = 0; - curwin->w_wcol = col; -@@ -1033,10 +1039,11 @@ curs_columns(scroll) - width = textwidth + curwin_col_off2(); - - /* long line wrapping, adjust curwin->w_wrow */ - if (curwin->w_wcol >= W_WIDTH(curwin)) - { -+ /* this same formula is used in validate_cursor_col() */ - n = (curwin->w_wcol - W_WIDTH(curwin)) / width + 1; - curwin->w_wcol -= n * width; - curwin->w_wrow += n; - - #ifdef FEAT_LINEBREAK -@@ -1227,15 +1234,14 @@ curs_columns(scroll) - } - - /* - * Scroll the current window down by "line_count" logical lines. "CTRL-Y" - */ --/*ARGSUSED*/ - void - scrolldown(line_count, byfold) - long line_count; -- int byfold; /* TRUE: count a closed fold as one line */ -+ int byfold UNUSED; /* TRUE: count a closed fold as one line */ - { - long done = 0; /* total # of physical lines done */ - int wrow; - int moved = FALSE; - -@@ -1247,11 +1253,12 @@ scrolldown(line_count, byfold) - #endif - validate_cursor(); /* w_wrow needs to be valid */ - while (line_count-- > 0) - { - #ifdef FEAT_DIFF -- if (curwin->w_topfill < diff_check(curwin, curwin->w_topline)) -+ if (curwin->w_topfill < diff_check(curwin, curwin->w_topline) -+ && curwin->w_topfill < curwin->w_height - 1) - { - ++curwin->w_topfill; - ++done; - } - else -@@ -1338,15 +1345,14 @@ scrolldown(line_count, byfold) - } - - /* - * Scroll the current window up by "line_count" logical lines. "CTRL-E" - */ --/*ARGSUSED*/ - void - scrollup(line_count, byfold) - long line_count; -- int byfold; /* TRUE: count a closed fold as one line */ -+ int byfold UNUSED; /* TRUE: count a closed fold as one line */ - { - #if defined(FEAT_FOLDING) || defined(FEAT_DIFF) - linenr_T lnum; - - if ( -@@ -1602,11 +1608,11 @@ scrollup_clamp() - - /* - * Add one line above "lp->lnum". This can be a filler line, a closed fold or - * a (wrapped) text line. Uses and sets "lp->fill". - * Returns the height of the added line in "lp->height". -- * Lines above the first one are incredibly high. -+ * Lines above the first one are incredibly high: MAXCOL. - */ - static void - topline_back(lp) - lineoff_T *lp; - { -@@ -1934,11 +1940,11 @@ scroll_cursor_bot(min_scroll, set_topbot - curwin->w_topline > 1; - curwin->w_topline = loff.lnum) - { - loff.lnum = curwin->w_topline; - topline_back(&loff); -- if (used + loff.height > curwin->w_height) -+ if (loff.height == MAXCOL || used + loff.height > curwin->w_height) - break; - used += loff.height; - #ifdef FEAT_DIFF - curwin->w_topfill = loff.fill; - #endif -@@ -2013,11 +2019,14 @@ scroll_cursor_bot(min_scroll, set_topbot - ) - break; - - /* Add one line above */ - topline_back(&loff); -- used += loff.height; -+ if (loff.height == MAXCOL) -+ used = MAXCOL; -+ else -+ used += loff.height; - if (used > curwin->w_height) - break; - if (loff.lnum >= curwin->w_botline - #ifdef FEAT_DIFF - && (loff.lnum > curwin->w_botline -@@ -2167,11 +2176,14 @@ scroll_cursor_halfway(atend) - } - - if (below > above) /* add a line above the cursor */ - { - topline_back(&loff); -- used += loff.height; -+ if (loff.height == MAXCOL) -+ used = MAXCOL; -+ else -+ used += loff.height; - if (used > curwin->w_height) - break; - above += loff.height; - topline = loff.lnum; - #ifdef FEAT_DIFF -@@ -2464,13 +2476,16 @@ onepage(dir, count) - * at the bottom of the window. */ - n = 0; - while (n <= curwin->w_height && loff.lnum >= 1) - { - topline_back(&loff); -- n += loff.height; -+ if (loff.height == MAXCOL) -+ n = MAXCOL; -+ else -+ n += loff.height; - } -- if (n <= curwin->w_height) /* at begin of file */ -+ if (loff.lnum < 1) /* at begin of file */ - { - curwin->w_topline = 1; - #ifdef FEAT_DIFF - max_topfill(); - #endif ---- vim72.orig/src/msvc2008.bat -+++ vim72/src/msvc2008.bat -@@ -1,5 +1,7 @@ -+@echo off - rem To be used on MS-Windows for Visual C++ 2008 Express Edition - rem aka Microsoft Visual Studio 9.0. - rem See INSTALLpc.txt for information. -+@echo on - - call "%VS90COMNTOOLS%%vsvars32.bat" ---- vim72.orig/src/nbdebug.c -+++ vim72/src/nbdebug.c -@@ -31,11 +31,10 @@ - - FILE *nb_debug = NULL; - u_int nb_dlevel = 0; /* nb_debug verbosity level */ - - void nbdb(char *, ...); --void nbtrace(char *, ...); - - static int lookup(char *); - #ifdef USE_NB_ERRORHANDLER - static int errorHandler(Display *, XErrorEvent *); - #endif -@@ -98,29 +97,10 @@ nbdebug_log_init( - } - - } /* end nbdebug_log_init */ - - -- -- --void --nbtrace( -- char *fmt, -- ...) --{ -- va_list ap; -- -- if (nb_debug!= NULL && (nb_dlevel & (NB_TRACE | NB_TRACE_VERBOSE))) { -- va_start(ap, fmt); -- vfprintf(nb_debug, fmt, ap); -- va_end(ap); -- fflush(nb_debug); -- } -- --} /* end nbtrace */ -- -- - void - nbdbg( - char *fmt, - ...) - { -@@ -134,27 +114,10 @@ nbdbg( - } - - } /* end nbdbg */ - - --void --nbprt( -- char *fmt, -- ...) --{ -- va_list ap; -- -- if (nb_debug != NULL && nb_dlevel & NB_PRINT) { -- va_start(ap, fmt); -- vfprintf(nb_debug, fmt, ap); -- va_end(ap); -- fflush(nb_debug); -- } -- --} /* end nbprt */ -- -- - static int - lookup( - char *file) - { - char buf[BUFSIZ]; ---- vim72.orig/src/nbdebug.h -+++ vim72/src/nbdebug.h -@@ -41,12 +41,10 @@ typedef enum { - WT_STOP /* look for ~/.gvimstop if set */ - } WtWait; - - - void nbdbg(char *, ...); --void nbprt(char *, ...); --void nbtrace(char *, ...); - - void nbdebug_wait __ARGS((u_int wait_flags, char *wait_var, u_int wait_secs)); - void nbdebug_log_init __ARGS((char *log_var, char *level_var)); - - extern FILE *nb_debug; -@@ -68,21 +66,7 @@ nbdbg( - char *fmt, - ...) - { - } - --void --nbprt( -- char *fmt, -- ...) --{ --} -- --void --nbtrace( -- char *fmt, -- ...) --{ --} -- - #endif /* NBDEBUG */ - #endif /* NBDEBUG_H */ ---- vim72.orig/src/netbeans.c -+++ vim72/src/netbeans.c -@@ -30,10 +30,11 @@ - # include <tchar.h> /* for _T definition for TRACEn macros */ - # endif - /* WinSock API is separated from C API, thus we can't use read(), write(), - * errno... */ - # define sock_errno WSAGetLastError() -+# undef ECONNREFUSED - # define ECONNREFUSED WSAECONNREFUSED - # ifdef EINTR - # undef EINTR - # endif - # define EINTR WSAEINTR -@@ -67,11 +68,12 @@ static char *ExtEdProtocolVersion = "2.4 - - static long pos2off __ARGS((buf_T *, pos_T *)); - static pos_T *off2pos __ARGS((buf_T *, long)); - static pos_T *get_off_or_lnum __ARGS((buf_T *buf, char_u **argp)); - static long get_buf_size __ARGS((buf_T *)); --static void netbeans_keystring __ARGS((int key, char *keystr)); -+static int netbeans_keystring __ARGS((char_u *keystr)); -+static void postpone_keycommand __ARGS((char_u *keystr)); - static void special_keys __ARGS((char_u *args)); - - static void netbeans_connect __ARGS((void)); - static int getConnInfo __ARGS((char *file, char **host, char **port, char **password)); - -@@ -499,11 +501,11 @@ getConnInfo(char *file, char **host, cha - } - - - struct keyqueue - { -- int key; -+ char_u *keystr; - struct keyqueue *next; - struct keyqueue *prev; - }; - - typedef struct keyqueue keyQ_T; -@@ -511,17 +513,21 @@ typedef struct keyqueue keyQ_T; - static keyQ_T keyHead; /* dummy node, header for circular queue */ - - - /* - * Queue up key commands sent from netbeans. -+ * We store the string, because it may depend on the global mod_mask and -+ * :nbkey doesn't have a key number. - */ - static void --postpone_keycommand(int key) -+postpone_keycommand(char_u *keystr) - { - keyQ_T *node; - - node = (keyQ_T *)alloc(sizeof(keyQ_T)); -+ if (node == NULL) -+ return; /* out of memory, drop the key */ - - if (keyHead.next == NULL) /* initialize circular queue */ - { - keyHead.next = &keyHead; - keyHead.prev = &keyHead; -@@ -531,28 +537,33 @@ postpone_keycommand(int key) - node->next = &keyHead; - node->prev = keyHead.prev; - keyHead.prev->next = node; - keyHead.prev = node; - -- node->key = key; -+ node->keystr = vim_strsave(keystr); - } - - /* - * Handle any queued-up NetBeans keycommands to be send. - */ - static void - handle_key_queue(void) - { -- while (keyHead.next && keyHead.next != &keyHead) -+ int postponed = FALSE; -+ -+ while (!postponed && keyHead.next && keyHead.next != &keyHead) - { - /* first, unlink the node */ - keyQ_T *node = keyHead.next; - keyHead.next = node->next; - node->next->prev = node->prev; - -- /* now, send the keycommand */ -- netbeans_keycommand(node->key); -+ /* Now, send the keycommand. This may cause it to be postponed again -+ * and change keyHead. */ -+ if (node->keystr != NULL) -+ postponed = !netbeans_keystring(node->keystr); -+ vim_free(node->keystr); - - /* Finally, dispose of the node */ - vim_free(node); - } - } -@@ -698,33 +709,43 @@ netbeans_parse_messages(void) - #define MAXMSGSIZE 4096 - - /* - * Read and process a command from netbeans. - */ --/*ARGSUSED*/ - #if defined(FEAT_GUI_W32) || defined(PROTO) - /* Use this one when generating prototypes, the others are static. */ - void - messageFromNetbeansW32() - #else - # ifdef FEAT_GUI_MOTIF - static void --messageFromNetbeans(XtPointer clientData, int *unused1, XtInputId *unused2) -+messageFromNetbeans(XtPointer clientData UNUSED, -+ int *unused1 UNUSED, -+ XtInputId *unused2 UNUSED) - # endif - # ifdef FEAT_GUI_GTK - static void --messageFromNetbeans(gpointer clientData, gint unused1, -- GdkInputCondition unused2) -+messageFromNetbeans(gpointer clientData UNUSED, -+ gint unused1 UNUSED, -+ GdkInputCondition unused2 UNUSED) - # endif - #endif - { - static char_u *buf = NULL; - int len; - int readlen = 0; - #ifndef FEAT_GUI_GTK - static int level = 0; - #endif -+#ifdef HAVE_SELECT -+ struct timeval tval; -+ fd_set rfds; -+#else -+# ifdef HAVE_POLL -+ struct pollfd fds; -+# endif -+#endif - - if (sd < 0) - { - nbdebug(("messageFromNetbeans() called without a socket\n")); - return; -@@ -740,13 +761,30 @@ messageFromNetbeans(gpointer clientData, - buf = alloc(MAXMSGSIZE); - if (buf == NULL) - return; /* out of memory! */ - } - -- /* Keep on reading for as long as there is something to read. */ -+ /* Keep on reading for as long as there is something to read. -+ * Use select() or poll() to avoid blocking on a message that is exactly -+ * MAXMSGSIZE long. */ - for (;;) - { -+#ifdef HAVE_SELECT -+ FD_ZERO(&rfds); -+ FD_SET(sd, &rfds); -+ tval.tv_sec = 0; -+ tval.tv_usec = 0; -+ if (select(sd + 1, &rfds, NULL, NULL, &tval) <= 0) -+ break; -+#else -+# ifdef HAVE_POLL -+ fds.fd = sd; -+ fds.events = POLLIN; -+ if (poll(&fds, 1, 0) <= 0) -+ break; -+# endif -+#endif - len = sock_read(sd, buf, MAXMSGSIZE); - if (len <= 0) - break; /* error or nothing more to read */ - - /* Store the read message in the queue. */ -@@ -767,15 +805,18 @@ messageFromNetbeans(gpointer clientData, - PERROR(_("read from Netbeans socket")); - } - return; /* don't try to parse it */ - } - --#ifdef FEAT_GUI_GTK -+#if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_W32) -+ /* Let the main loop handle messages. */ -+# ifdef FEAT_GUI_GTK - if (gtk_main_level() > 0) - gtk_main_quit(); -+# endif - #else -- /* Parse the messages, but avoid recursion. */ -+ /* Parse the messages now, but avoid recursion. */ - if (level == 1) - netbeans_parse_messages(); - - --level; - #endif -@@ -865,11 +906,11 @@ nb_parse_cmd(char_u *cmd) - - if (nb_do_cmd(bufno, (char_u *)verb, isfunc, r_cmdno, (char_u *)q) == FAIL) - { - #ifdef NBDEBUG - /* -- * This happens because the ExtEd can send a cammand or 2 after -+ * This happens because the ExtEd can send a command or 2 after - * doing a stopDocumentListen command. It doesn't harm anything - * so I'm disabling it except for debugging. - */ - nbdebug(("nb_parse_cmd: Command error for \"%s\"\n", cmd)); - EMSG("E629: bad return from nb_do_cmd"); -@@ -1041,11 +1082,11 @@ netbeans_end(void) - } - sprintf(buf, "%d:killed=%d\n", i, r_cmdno); - nbdebug(("EVT: %s", buf)); - /* nb_send(buf, "netbeans_end"); avoid "write failed" messages */ - if (sd >= 0) -- sock_write(sd, buf, (int)STRLEN(buf)); /* ignore errors */ -+ ignored = sock_write(sd, buf, (int)STRLEN(buf)); - } - } - - /* - * Send a message to netbeans. -@@ -1166,11 +1207,11 @@ nb_quote(char_u *txt) - default: - *q++ = *p; - break; - } - } -- *q++ = '\0'; -+ *q = '\0'; - - return buf; - } - - -@@ -1491,33 +1532,36 @@ nb_do_cmd( - netbeansFireChanges = oldFire; - netbeansSuppressNoLines = oldSuppress; - return FAIL; - } - first = *pos; -- nbdebug((" FIRST POS: line %d, col %d\n", first.lnum, first.col)); -+ nbdebug((" FIRST POS: line %d, col %d\n", -+ first.lnum, first.col)); - pos = off2pos(buf->bufp, off+count-1); - if (!pos) - { - nbdebug((" !bad count\n")); - nb_reply_text(cmdno, (char_u *)"!bad count"); - netbeansFireChanges = oldFire; - netbeansSuppressNoLines = oldSuppress; - return FAIL; - } - last = *pos; -- nbdebug((" LAST POS: line %d, col %d\n", last.lnum, last.col)); -+ nbdebug((" LAST POS: line %d, col %d\n", -+ last.lnum, last.col)); - del_from_lnum = first.lnum; - del_to_lnum = last.lnum; - doupdate = 1; - - /* Get the position of the first byte after the deleted - * section. "next" is NULL when deleting to the end of the - * file. */ - next = off2pos(buf->bufp, off + count); - - /* Remove part of the first line. */ -- if (first.col != 0 || (next != NULL && first.lnum == next->lnum)) -+ if (first.col != 0 -+ || (next != NULL && first.lnum == next->lnum)) - { - if (first.lnum != last.lnum - || (next != NULL && first.lnum != next->lnum)) - { - /* remove to the end of the first line */ -@@ -1576,18 +1620,22 @@ nb_do_cmd( - for (i = del_from_lnum; i <= del_to_lnum; i++) - { - int id = buf_findsign_id(buf->bufp, (linenr_T)i); - if (id > 0) - { -- nbdebug((" Deleting sign %d on line %d\n", id, i)); -+ nbdebug((" Deleting sign %d on line %d\n", -+ id, i)); - buf_delsign(buf->bufp, id); - } - else -+ { - nbdebug((" No sign on line %d\n", i)); -+ } - } - -- nbdebug((" Deleting lines %d through %d\n", del_from_lnum, del_to_lnum)); -+ nbdebug((" Deleting lines %d through %d\n", -+ del_from_lnum, del_to_lnum)); - curwin->w_cursor.lnum = del_from_lnum; - curwin->w_cursor.col = 0; - del_lines(del_to_lnum - del_from_lnum + 1, FALSE); - } - -@@ -1793,11 +1841,11 @@ nb_do_cmd( - } - vim_free(buf->displayname); - buf->displayname = NULL; - - netbeansReadFile = 0; /* don't try to open disk file */ -- do_ecmd(0, NULL, 0, 0, ECMD_ONE, ECMD_HIDE + ECMD_OLDBUF); -+ do_ecmd(0, NULL, 0, 0, ECMD_ONE, ECMD_HIDE + ECMD_OLDBUF, curwin); - netbeansReadFile = 1; - buf->bufp = curbuf; - maketitle(); - buf->insertDone = FALSE; - gui_update_menus(0); -@@ -1919,11 +1967,11 @@ nb_do_cmd( - return FAIL; - bufp = buflist_findname(path); - vim_free(path); - if (bufp == NULL) - { -- nbdebug((" File %s not found in setBufferNumber\n", args)); -+ nbdebug((" File %s not found in setBufferNumber\n", args)); - EMSG2("E642: File %s not found in setBufferNumber", args); - return FAIL; - } - buf->bufp = bufp; - buf->nbbuf_number = bufp->b_fnum; -@@ -1958,11 +2006,11 @@ nb_do_cmd( - vim_free(buf->displayname); - buf->displayname = nb_unquote(args, NULL); - - netbeansReadFile = 0; /* don't try to open disk file */ - do_ecmd(0, (char_u *)buf->displayname, 0, 0, ECMD_ONE, -- ECMD_HIDE + ECMD_OLDBUF); -+ ECMD_HIDE + ECMD_OLDBUF, curwin); - netbeansReadFile = 1; - buf->bufp = curbuf; - maketitle(); - gui_update_menus(0); - /* =====================================================================*/ -@@ -1977,11 +2025,11 @@ nb_do_cmd( - } - /* Edit a file: like create + setFullName + read the file. */ - vim_free(buf->displayname); - buf->displayname = nb_unquote(args, NULL); - do_ecmd(0, (char_u *)buf->displayname, NULL, NULL, ECMD_ONE, -- ECMD_HIDE + ECMD_OLDBUF); -+ ECMD_HIDE + ECMD_OLDBUF, curwin); - buf->bufp = curbuf; - buf->initDone = TRUE; - doupdate = 1; - #if defined(FEAT_TITLE) - maketitle(); -@@ -2139,11 +2187,13 @@ nb_do_cmd( - #ifdef FEAT_FOLDING - foldOpenCursor(); - #endif - } - else -+ { - nbdebug((" BAD POSITION in setDot: %s\n", s)); -+ } - - /* gui_update_cursor(TRUE, FALSE); */ - /* update_curbuf(NOT_VALID); */ - update_topline(); /* scroll to show the line */ - update_screen(VALID); -@@ -2275,13 +2325,10 @@ nb_do_cmd( - { - #ifdef FEAT_SIGNS - int serNum; - int localTypeNum; - int typeNum; --# ifdef NBDEBUG -- int len; --# endif - pos_T *pos; - - if (buf == NULL || buf->bufp == NULL) - { - nbdebug((" invalid buffer identifier in addAnno\n")); -@@ -2301,17 +2348,14 @@ nb_do_cmd( - typeNum = mapsigntype(buf, localTypeNum); - - pos = get_off_or_lnum(buf->bufp, &args); - - cp = (char *)args; --# ifdef NBDEBUG -- len = --# endif -- strtol(cp, &cp, 10); -+ ignored = (int)strtol(cp, &cp, 10); - args = (char_u *)cp; - # ifdef NBDEBUG -- if (len != -1) -+ if (ignored != -1) - { - nbdebug((" partial line annotation -- Not Yet Implemented!\n")); - } - # endif - if (serNum >= GUARDEDOFFSET) -@@ -2319,11 +2363,11 @@ nb_do_cmd( - nbdebug((" too many annotations! ignoring...\n")); - return FAIL; - } - if (pos) - { -- coloncmd(":sign place %d line=%d name=%d buffer=%d", -+ coloncmd(":sign place %d line=%ld name=%d buffer=%d", - serNum, pos->lnum, typeNum, buf->bufp->b_fnum); - if (typeNum == curPCtype) - coloncmd(":sign jump %d buffer=%d", serNum, - buf->bufp->b_fnum); - } -@@ -2423,11 +2467,11 @@ nb_do_cmd( - { - if (buf_findsigntype_id(buf->bufp, lnum, - GUARDED) == 0) - { - coloncmd( -- ":sign place %d line=%d name=%d buffer=%d", -+ ":sign place %d line=%ld name=%d buffer=%d", - guardId++, lnum, GUARDED, - buf->bufp->b_fnum); - } - } - } -@@ -2484,11 +2528,11 @@ nb_do_cmd( - #endif - } - } - else - { -- nbdebug((" Buffer has no changes!\n")); -+ nbdebug((" Buffer has no changes!\n")); - } - /* =====================================================================*/ - } - else if (streq((char *)cmd, "netbeansBuffer")) - { -@@ -2580,11 +2624,11 @@ coloncmd(char *cmd, ...) - { - char buf[1024]; - va_list ap; - - va_start(ap, cmd); -- vsprintf(buf, cmd, ap); -+ vim_vsnprintf(buf, sizeof(buf), cmd, ap, NULL); - va_end(ap); - - nbdebug((" COLONCMD %s\n", buf)); - - /* ALT_INPUT_LOCK_ON; */ -@@ -2647,11 +2691,11 @@ special_keys(char_u *args) - - void - ex_nbkey(eap) - exarg_T *eap; - { -- netbeans_keystring(0, (char *)eap->arg); -+ (void)netbeans_keystring(eap->arg); - } - - - /* - * Initialize highlights and signs for use by netbeans (mostly obsolete) -@@ -2669,11 +2713,11 @@ nb_init_graphics(void) - did_init = TRUE; - } - } - - /* -- * Convert key to netbeans name. -+ * Convert key to netbeans name. This uses the global "mod_mask". - */ - static void - netbeans_keyname(int key, char *buf) - { - char *name = 0; -@@ -2745,15 +2789,14 @@ netbeans_keyname(int key, char *buf) - /* - * Function to be called for balloon evaluation. Grabs the text under the - * cursor and sends it to the debugger for evaluation. The debugger should - * respond with a showBalloon command when there is a useful result. - */ --/*ARGSUSED*/ - void - netbeans_beval_cb( - BalloonEval *beval, -- int state) -+ int state UNUSED) - { - win_T *wp; - char_u *text; - linenr_T lnum; - int col; -@@ -2922,48 +2965,30 @@ netbeans_file_opened(buf_T *bufp) - if (p_acd && vim_chdirfile(bufp->b_ffname) == OK) - shorten_fnames(TRUE); - } - - /* -- * Tell netbeans a file was closed. -+ * Tell netbeans that a file was deleted or wiped out. - */ - void --netbeans_file_closed(buf_T *bufp) -+netbeans_file_killed(buf_T *bufp) - { - int bufno = nb_getbufno(bufp); - nbbuf_T *nbbuf = nb_get_buf(bufno); - char buffer[2*MAXPATHL]; - -- if (!haveConnection || bufno < 0) -+ if (!haveConnection || bufno == -1) - return; - -- if (!netbeansCloseFile) -- { -- nbdebug(("Ignoring file_closed for %s. File was closed from IDE\n", -- bufp->b_ffname)); -- return; -- } -- -- nbdebug(("netbeans_file_closed:\n")); -- nbdebug((" Closing bufno: %d", bufno)); -- if (curbuf != NULL && curbuf != bufp) -- { -- nbdebug((" Curbuf bufno: %d\n", nb_getbufno(curbuf))); -- } -- else if (curbuf == bufp) -- { -- nbdebug((" curbuf == bufp\n")); -- } -- -- if (bufno <= 0) -- return; -+ nbdebug(("netbeans_file_killed:\n")); -+ nbdebug((" Killing bufno: %d", bufno)); - - sprintf(buffer, "%d:killed=%d\n", bufno, r_cmdno); - - nbdebug(("EVT: %s", buffer)); - -- nb_send(buffer, "netbeans_file_closed"); -+ nb_send(buffer, "netbeans_file_killed"); - - if (nbbuf != NULL) - nbbuf->bufp = NULL; - } - -@@ -3078,15 +3103,14 @@ netbeans_removed( - nbdebug(("EVT: %s", buf)); - nb_send((char *)buf, "netbeans_removed"); - } - - /* -- * Send netbeans an unmodufied command. -+ * Send netbeans an unmodified command. - */ --/*ARGSUSED*/ - void --netbeans_unmodified(buf_T *bufp) -+netbeans_unmodified(buf_T *bufp UNUSED) - { - #if 0 - char_u buf[128]; - int bufno; - nbbuf_T *nbbuf; -@@ -3136,56 +3160,59 @@ netbeans_button_release(int button) - - - /* - * Send a keypress event back to netbeans. This usually simulates some - * kind of function key press. This function operates on a key code. -+ * Return TRUE when the key was sent, FALSE when the command has been -+ * postponed. - */ -- void -+ int - netbeans_keycommand(int key) - { - char keyName[60]; - - netbeans_keyname(key, keyName); -- netbeans_keystring(key, keyName); -+ return netbeans_keystring((char_u *)keyName); - } - - - /* - * Send a keypress event back to netbeans. This usually simulates some - * kind of function key press. This function operates on a key string. -+ * Return TRUE when the key was sent, FALSE when the command has been -+ * postponed. - */ -- static void --netbeans_keystring(int key, char *keyName) -+ static int -+netbeans_keystring(char_u *keyName) - { - char buf[2*MAXPATHL]; - int bufno = nb_getbufno(curbuf); - long off; - char_u *q; - - if (!haveConnection) -- return; -+ return TRUE; - - - if (bufno == -1) - { - nbdebug(("got keycommand for non-NetBeans buffer, opening...\n")); - q = curbuf->b_ffname == NULL ? (char_u *)"" - : nb_quote(curbuf->b_ffname); - if (q == NULL) -- return; -+ return TRUE; - vim_snprintf(buf, sizeof(buf), "0:fileOpened=%d \"%s\" %s %s\n", 0, - q, - "T", /* open in NetBeans */ - "F"); /* modified */ - if (curbuf->b_ffname != NULL) - vim_free(q); - nbdebug(("EVT: %s", buf)); - nb_send(buf, "netbeans_keycommand"); - -- if (key > 0) -- postpone_keycommand(key); -- return; -+ postpone_keycommand(keyName); -+ return FALSE; - } - - /* sync the cursor position */ - off = pos2off(curbuf, &curwin->w_cursor); - sprintf(buf, "%d:newDotAndMark=%d %ld %ld\n", bufno, r_cmdno, off, off); -@@ -3207,10 +3234,11 @@ netbeans_keystring(int key, char *keyNam - vim_snprintf(buf, sizeof(buf), "%d:keyAtPos=%d \"%s\" %ld %ld/%ld\n", - bufno, r_cmdno, keyName, - off, (long)curwin->w_cursor.lnum, (long)curwin->w_cursor.col); - nbdebug(("EVT: %s", buf)); - nb_send(buf, "netbeans_keycommand"); -+ return TRUE; - } - - - /* - * Send a save event to netbeans. -@@ -3375,11 +3403,11 @@ netbeans_gutter_click(linenr_T lnum) - } - } - - - /* -- * Add a sign of the reqested type at the requested location. -+ * Add a sign of the requested type at the requested location. - * - * Reverse engineering: - * Apparently an annotation is defined the first time it is used in a buffer. - * When the same annotation is used in two buffers, the second time we do not - * need to define a new sign name but reuse the existing one. But since the -@@ -3389,17 +3417,16 @@ netbeans_gutter_click(linenr_T lnum) - * - * globalsignmap[] stores the signs that have been defined globally. - * buf->signmapused[] maps buffer-local annotation IDs to an index in - * globalsignmap[]. - */ --/*ARGSUSED*/ - static void - addsigntype( - nbbuf_T *buf, - int typeNum, - char_u *typeName, -- char_u *tooltip, -+ char_u *tooltip UNUSED, - char_u *glyphFile, - int use_fg, - int fg, - int use_bg, - int bg) -@@ -3529,11 +3556,12 @@ get_buf_size(buf_T *bufp) - eol_size = 2; - else - eol_size = 1; - for (lnum = 1; lnum <= bufp->b_ml.ml_line_count; ++lnum) - { -- char_count += (long)STRLEN(ml_get(lnum)) + eol_size; -+ char_count += (long)STRLEN(ml_get_buf(bufp, lnum, FALSE)) -+ + eol_size; - /* Check for a CTRL-C every 100000 characters */ - if (char_count > last_check) - { - ui_breakcheck(); - if (got_int) ---- vim72.orig/src/normal.c -+++ vim72/src/normal.c -@@ -181,10 +181,12 @@ static void nv_drop __ARGS((cmdarg_T *ca - #endif - #ifdef FEAT_AUTOCMD - static void nv_cursorhold __ARGS((cmdarg_T *cap)); - #endif - -+static char *e_noident = N_("E349: No identifier under cursor"); -+ - /* - * Function to be called for a Normal or Visual mode command. - * The argument is a cmdarg_T. - */ - typedef void (*nv_func_T) __ARGS((cmdarg_T *cap)); -@@ -489,18 +491,18 @@ nv_compare(s1, s2) - init_normal_cmds() - { - int i; - - /* Fill the index table with a one to one relation. */ -- for (i = 0; i < NV_CMDS_SIZE; ++i) -+ for (i = 0; i < (int)NV_CMDS_SIZE; ++i) - nv_cmd_idx[i] = i; - - /* Sort the commands by the command character. */ - qsort((void *)&nv_cmd_idx, (size_t)NV_CMDS_SIZE, sizeof(short), nv_compare); - - /* Find the first entry that can't be indexed by the command character. */ -- for (i = 0; i < NV_CMDS_SIZE; ++i) -+ for (i = 0; i < (int)NV_CMDS_SIZE; ++i) - if (i != nv_cmds[nv_cmd_idx[i]].cmd_char) - break; - nv_max_linear = i - 1; - } - -@@ -557,15 +559,14 @@ find_command(cmdchar) - } - - /* - * Execute a command in Normal mode. - */ --/*ARGSUSED*/ - void - normal_cmd(oap, toplevel) - oparg_T *oap; -- int toplevel; /* TRUE when called from main() */ -+ int toplevel UNUSED; /* TRUE when called from main() */ - { - cmdarg_T ca; /* command arguments */ - int c; - int ctrl_w = FALSE; /* got CTRL-W command */ - int old_col = curwin->w_curswant; -@@ -576,10 +577,13 @@ normal_cmd(oap, toplevel) - pos_T old_pos; /* cursor position before command */ - int mapped_len; - static int old_mapped_len = 0; - #endif - int idx; -+#ifdef FEAT_EVAL -+ int set_prevcount = FALSE; -+#endif - - vim_memset(&ca, 0, sizeof(ca)); /* also resets ca.retval */ - ca.oap = oap; - - /* Use a count remembered from before entering an operator. After typing -@@ -611,11 +615,16 @@ normal_cmd(oap, toplevel) - #endif - - /* When not finishing an operator and no register name typed, reset the - * count. */ - if (!finish_op && !oap->regname) -+ { - ca.opcount = 0; -+#ifdef FEAT_EVAL -+ set_prevcount = TRUE; -+#endif -+ } - - #ifdef FEAT_AUTOCMD - /* Restore counts from before receiving K_CURSORHOLD. This means after - * typing "3", handling K_CURSORHOLD and then typing "2" we get "32", not - * "3 * 2". */ -@@ -639,14 +648,11 @@ normal_cmd(oap, toplevel) - - /* - * Get the command character from the user. - */ - c = safe_vgetc(); -- --#ifdef FEAT_LANGMAP - LANGMAP_ADJUST(c, TRUE); --#endif - - #ifdef FEAT_VISUAL - /* - * If a mapping was started in Visual or Select mode, remember the length - * of the mapping. This is used below to not return to Insert mode for as -@@ -715,22 +721,28 @@ getcount: - #ifdef FEAT_EVAL - /* Set v:count here, when called from main() and not a stuffed - * command, so that v:count can be used in an expression mapping - * right after the count. */ - if (toplevel && stuff_empty()) -- set_vcount(ca.count0, ca.count0 == 0 ? 1 : ca.count0); -+ { -+ long count = ca.count0; -+ -+ /* multiply with ca.opcount the same way as below */ -+ if (ca.opcount != 0) -+ count = ca.opcount * (count == 0 ? 1 : count); -+ set_vcount(count, count == 0 ? 1 : count, set_prevcount); -+ set_prevcount = FALSE; /* only set v:prevcount once */ -+ } - #endif - if (ctrl_w) - { - ++no_mapping; - ++allow_keys; /* no mapping for nchar, but keys */ - } - ++no_zero_mapping; /* don't map zero here */ - c = plain_vgetc(); --#ifdef FEAT_LANGMAP - LANGMAP_ADJUST(c, TRUE); --#endif - --no_zero_mapping; - if (ctrl_w) - { - --no_mapping; - --allow_keys; -@@ -749,13 +761,11 @@ getcount: - ca.opcount = ca.count0; /* remember first count */ - ca.count0 = 0; - ++no_mapping; - ++allow_keys; /* no mapping for nchar, but keys */ - c = plain_vgetc(); /* get next character */ --#ifdef FEAT_LANGMAP - LANGMAP_ADJUST(c, TRUE); --#endif - --no_mapping; - --allow_keys; - #ifdef FEAT_CMDL_INFO - need_flushbuf |= add_to_showcmd(c); - #endif -@@ -802,11 +812,11 @@ getcount: - #ifdef FEAT_EVAL - /* - * Only set v:count when called from main() and not a stuffed command. - */ - if (toplevel && stuff_empty()) -- set_vcount(ca.count0, ca.count1); -+ set_vcount(ca.count0, ca.count1, set_prevcount); - #endif - - /* - * Find the command character in the table of commands. - * For CTRL-W we already got nchar when looking for a count. -@@ -939,13 +949,11 @@ getcount: - /* - * For 'g' get the next character now, so that we can check for - * "gr", "g'" and "g`". - */ - ca.nchar = plain_vgetc(); --#ifdef FEAT_LANGMAP - LANGMAP_ADJUST(ca.nchar, TRUE); --#endif - #ifdef FEAT_CMDL_INFO - need_flushbuf |= add_to_showcmd(ca.nchar); - #endif - if (ca.nchar == 'r' || ca.nchar == '\'' || ca.nchar == '`' - || ca.nchar == Ctrl_BSL) -@@ -1042,14 +1050,12 @@ getcount: - # endif - } - } - #endif - --#ifdef FEAT_LANGMAP - /* adjust chars > 127, except after "tTfFr" commands */ - LANGMAP_ADJUST(*cp, !lang); --#endif - #ifdef FEAT_RIGHTLEFT - /* adjust Hebrew mapped char */ - if (p_hkmap && lang && KeyTyped) - *cp = hkmap(*cp); - # ifdef FEAT_FKMAP -@@ -1130,11 +1136,12 @@ getcount: - */ - if (need_flushbuf) - out_flush(); - #endif - #ifdef FEAT_AUTOCMD -- did_cursorhold = FALSE; -+ if (ca.cmdchar != K_IGNORE) -+ did_cursorhold = FALSE; - #endif - - State = NORMAL; - - if (ca.nchar == ESC) -@@ -2178,14 +2185,13 @@ op_colon(oap) - } - - /* - * Handle the "g@" operator: call 'operatorfunc'. - */ --/*ARGSUSED*/ - static void - op_function(oap) -- oparg_T *oap; -+ oparg_T *oap UNUSED; - { - #ifdef FEAT_EVAL - char_u *(argv[1]); - - if (*p_opfunc == NUL) -@@ -3507,11 +3513,11 @@ find_ident_at_pos(wp, lnum, startcol, st - * didn't find an identifier or string - */ - if (find_type & FIND_STRING) - EMSG(_("E348: No string under cursor")); - else -- EMSG(_("E349: No identifier under cursor")); -+ EMSG(_(e_noident)); - return 0; - } - ptr += col; - *string = ptr; - -@@ -3699,17 +3705,17 @@ clear_showcmd() - return; - - #ifdef FEAT_VISUAL - if (VIsual_active && !char_avail()) - { -- int i = lt(VIsual, curwin->w_cursor); -+ int cursor_bot = lt(VIsual, curwin->w_cursor); - long lines; - colnr_T leftcol, rightcol; - linenr_T top, bot; - - /* Show the size of the Visual area. */ -- if (i) -+ if (cursor_bot) - { - top = VIsual.lnum; - bot = curwin->w_cursor.lnum; - } - else -@@ -3724,18 +3730,27 @@ clear_showcmd() - # endif - lines = bot - top + 1; - - if (VIsual_mode == Ctrl_V) - { -+#ifdef FEAT_LINEBREAK -+ char_u *saved_sbr = p_sbr; -+ -+ /* Make 'sbr' empty for a moment to get the correct size. */ -+ p_sbr = empty_option; -+#endif - getvcols(curwin, &curwin->w_cursor, &VIsual, &leftcol, &rightcol); -+#ifdef FEAT_LINEBREAK -+ p_sbr = saved_sbr; -+#endif - sprintf((char *)showcmd_buf, "%ldx%ld", lines, - (long)(rightcol - leftcol + 1)); - } - else if (VIsual_mode == 'V' || VIsual.lnum != curwin->w_cursor.lnum) - sprintf((char *)showcmd_buf, "%ld", lines); - else -- sprintf((char *)showcmd_buf, "%ld", (long)(i -+ sprintf((char *)showcmd_buf, "%ld", (long)(cursor_bot - ? curwin->w_cursor.col - VIsual.col - : VIsual.col - curwin->w_cursor.col) + (*p_sel != 'e')); - showcmd_buf[SHOWCMD_COLS] = NUL; /* truncate */ - showcmd_visual = TRUE; - } -@@ -4081,14 +4096,13 @@ nv_ignore(cap) - - /* - * Command character that doesn't do anything, but unlike nv_ignore() does - * start edit(). Used for "startinsert" executed while starting up. - */ --/*ARGSUSED */ - static void - nv_nop(cap) -- cmdarg_T *cap; -+ cmdarg_T *cap UNUSED; - { - } - - /* - * Command character doesn't exist. -@@ -4609,13 +4623,11 @@ nv_zet(cap) - dont_scroll = TRUE; /* disallow scrolling here */ - #endif - ++no_mapping; - ++allow_keys; /* no mapping for nchar, but allow key codes */ - nchar = plain_vgetc(); --#ifdef FEAT_LANGMAP - LANGMAP_ADJUST(nchar, TRUE); --#endif - --no_mapping; - --allow_keys; - #ifdef FEAT_CMDL_INFO - (void)add_to_showcmd(nchar); - #endif -@@ -4967,13 +4979,11 @@ dozet: - #ifdef FEAT_SPELL - case 'u': /* "zug" and "zuw": undo "zg" and "zw" */ - ++no_mapping; - ++allow_keys; /* no mapping for nchar, but allow key codes */ - nchar = plain_vgetc(); --#ifdef FEAT_LANGMAP - LANGMAP_ADJUST(nchar, TRUE); --#endif - --no_mapping; - --allow_keys; - #ifdef FEAT_CMDL_INFO - (void)add_to_showcmd(nchar); - #endif -@@ -5226,11 +5236,11 @@ nv_colon(cap) - /* The start of the operator may have become invalid by the Ex - * command. */ - if (cap->oap->op_type != OP_NOP - && (cap->oap->start.lnum > curbuf->b_ml.ml_line_count - || cap->oap->start.col > -- STRLEN(ml_get(cap->oap->start.lnum)))) -+ (colnr_T)STRLEN(ml_get(cap->oap->start.lnum)))) - clearopbeep(cap->oap); - } - } - - /* -@@ -5394,10 +5404,11 @@ nv_ident(cap) - char_u *kp; /* value of 'keywordprg' */ - int kp_help; /* 'keywordprg' is ":help" */ - int n = 0; /* init for GCC */ - int cmdchar; - int g_cmd; /* "g" command */ -+ int tag_cmd = FALSE; - char_u *aux_ptr; - int isman; - int isman_s; - - if (cap->cmdchar == 'g') /* "g*", "g#", "g]" and "gCTRL-]" */ -@@ -5467,10 +5478,24 @@ nv_ident(cap) - case 'K': - if (kp_help) - STRCPY(buf, "he! "); - else - { -+ /* An external command will probably use an argument starting -+ * with "-" as an option. To avoid trouble we skip the "-". */ -+ while (*ptr == '-' && n > 0) -+ { -+ ++ptr; -+ --n; -+ } -+ if (n == 0) -+ { -+ EMSG(_(e_noident)); /* found dashes only */ -+ vim_free(buf); -+ return; -+ } -+ - /* When a count is given, turn it into a range. Is this - * really what we want? */ - isman = (STRCMP(kp, "man") == 0); - isman_s = (STRCMP(kp, "man -s") == 0); - if (cap->count0 != 0 && !(isman || isman_s)) -@@ -5489,61 +5514,90 @@ nv_ident(cap) - } - } - break; - - case ']': -+ tag_cmd = TRUE; - #ifdef FEAT_CSCOPE - if (p_cst) - STRCPY(buf, "cstag "); - else - #endif - STRCPY(buf, "ts "); - break; - - default: -+ tag_cmd = TRUE; - if (curbuf->b_help) - STRCPY(buf, "he! "); -- else if (g_cmd) -- STRCPY(buf, "tj "); - else -- sprintf((char *)buf, "%ldta ", cap->count0); -+ { -+ if (g_cmd) -+ STRCPY(buf, "tj "); -+ else -+ sprintf((char *)buf, "%ldta ", cap->count0); -+ } - } - - /* - * Now grab the chars in the identifier - */ -- if (cmdchar == '*') -- aux_ptr = (char_u *)(p_magic ? "/.*~[^$\\" : "/^$\\"); -- else if (cmdchar == '#') -- aux_ptr = (char_u *)(p_magic ? "/?.*~[^$\\" : "/?^$\\"); -- else if (cmdchar == 'K' && !kp_help) -- aux_ptr = (char_u *)" \t\\\"|!"; -- else -- /* Don't escape spaces and Tabs in a tag with a backslash */ -- aux_ptr = (char_u *)"\\|\""; -- -- p = buf + STRLEN(buf); -- while (n-- > 0) -- { -- /* put a backslash before \ and some others */ -- if (vim_strchr(aux_ptr, *ptr) != NULL) -- *p++ = '\\'; --#ifdef FEAT_MBYTE -- /* When current byte is a part of multibyte character, copy all bytes -- * of that character. */ -- if (has_mbyte) -+ if (cmdchar == 'K' && !kp_help) -+ { -+ /* Escape the argument properly for a shell command */ -+ ptr = vim_strnsave(ptr, n); -+ p = vim_strsave_shellescape(ptr, TRUE); -+ vim_free(ptr); -+ if (p == NULL) - { -- int i; -- int len = (*mb_ptr2len)(ptr) - 1; -- -- for (i = 0; i < len && n >= 1; ++i, --n) -- *p++ = *ptr++; -+ vim_free(buf); -+ return; -+ } -+ buf = (char_u *)vim_realloc(buf, STRLEN(buf) + STRLEN(p) + 1); -+ if (buf == NULL) -+ { -+ vim_free(buf); -+ vim_free(p); -+ return; - } -+ STRCAT(buf, p); -+ vim_free(p); -+ } -+ else -+ { -+ if (cmdchar == '*') -+ aux_ptr = (char_u *)(p_magic ? "/.*~[^$\\" : "/^$\\"); -+ else if (cmdchar == '#') -+ aux_ptr = (char_u *)(p_magic ? "/?.*~[^$\\" : "/?^$\\"); -+ else if (tag_cmd) -+ /* Don't escape spaces and Tabs in a tag with a backslash */ -+ aux_ptr = (char_u *)"\\|\"\n["; -+ else -+ aux_ptr = (char_u *)"\\|\"\n*?["; -+ -+ p = buf + STRLEN(buf); -+ while (n-- > 0) -+ { -+ /* put a backslash before \ and some others */ -+ if (vim_strchr(aux_ptr, *ptr) != NULL) -+ *p++ = '\\'; -+#ifdef FEAT_MBYTE -+ /* When current byte is a part of multibyte character, copy all -+ * bytes of that character. */ -+ if (has_mbyte) -+ { -+ int i; -+ int len = (*mb_ptr2len)(ptr) - 1; -+ -+ for (i = 0; i < len && n >= 1; ++i, --n) -+ *p++ = *ptr++; -+ } - #endif -- *p++ = *ptr++; -+ *p++ = *ptr++; -+ } -+ *p = NUL; - } -- *p = NUL; - - /* - * Execute the command. - */ - if (cmdchar == '*' || cmdchar == '#') -@@ -5554,10 +5608,11 @@ nv_ident(cap) - #endif - vim_iswordc(ptr[-1]))) - STRCAT(buf, "\\>"); - #ifdef FEAT_CMDHIST - /* put pattern in search history */ -+ init_history(); - add_to_history(HIST_SEARCH, buf, TRUE, NUL); - #endif - normal_search(cap, cmdchar == '*' ? '/' : '?', buf, 0); - } - else -@@ -5765,11 +5820,14 @@ nv_right(cap) - #endif - - for (n = cap->count1; n > 0; --n) - { - if ((!PAST_LINE && oneright() == FAIL) -- || (PAST_LINE && *ml_get_cursor() == NUL)) -+#ifdef FEAT_VISUAL -+ || (PAST_LINE && *ml_get_cursor() == NUL) -+#endif -+ ) - { - /* - * <Space> wraps to next line if 'whichwrap' has 's'. - * 'l' wraps to next line if 'whichwrap' has 'l'. - * CURS_RIGHT wraps to next line if 'whichwrap' has '>'. -@@ -6009,11 +6067,11 @@ nv_gotofile(cap) - /* do autowrite if necessary */ - if (curbufIsChanged() && curbuf->b_nwindows <= 1 && !P_HID(curbuf)) - autowrite(curbuf, FALSE); - setpcmark(); - (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LAST, -- P_HID(curbuf) ? ECMD_HIDE : 0); -+ P_HID(curbuf) ? ECMD_HIDE : 0, curwin); - if (cap->nchar == 'F' && lnum >= 0) - { - curwin->w_cursor.lnum = lnum; - check_cursor_lnum(); - beginline(BL_SOL | BL_FIX); -@@ -6726,10 +6784,12 @@ nv_replace(cap) - - #ifdef FEAT_VISUAL - /* Visual mode "r" */ - if (VIsual_active) - { -+ if (got_int) -+ reset_VIsual(); - nv_operator(cap); - return; - } - #endif - -@@ -7782,11 +7842,11 @@ nv_g_cmd(cap) - i = (curwin->w_virtcol - width1) / width2 * width2 + width1; - } - else - i = curwin->w_leftcol; - /* Go to the middle of the screen line. When 'number' is on and lines -- * are wrapping the middle can be more to the left.*/ -+ * are wrapping the middle can be more to the left. */ - if (cap->nchar == 'm') - i += (W_WIDTH(curwin) - curwin_col_off() - + ((curwin->w_p_wrap && i > 0) - ? curwin_col_off2() : 0)) / 2; - coladvance((colnr_T)i); -@@ -7819,10 +7879,13 @@ nv_g_cmd(cap) - /* Decrease the cursor column until it's on a non-blank. */ - while (curwin->w_cursor.col > 0 - && vim_iswhite(ptr[curwin->w_cursor.col])) - --curwin->w_cursor.col; - curwin->w_set_curswant = TRUE; -+#ifdef FEAT_VISUAL -+ adjust_for_sel(cap); -+#endif - } - break; - - case '$': - case K_END: -@@ -9190,14 +9253,13 @@ nv_open(cap) - #endif - n_opencmd(cap); - } - - #ifdef FEAT_SNIFF --/*ARGSUSED*/ - static void - nv_sniff(cap) -- cmdarg_T *cap; -+ cmdarg_T *cap UNUSED; - { - ProcessSniffRequests(); - } - #endif - -@@ -9209,14 +9271,13 @@ nv_nbcmd(cap) - netbeans_keycommand(cap->nchar); - } - #endif - - #ifdef FEAT_DND --/*ARGSUSED*/ - static void - nv_drop(cap) -- cmdarg_T *cap; -+ cmdarg_T *cap UNUSED; - { - do_put('~', BACKWARD, 1L, PUT_CURSEND); - } - #endif - -@@ -9224,11 +9285,10 @@ nv_drop(cap) - /* - * Trigger CursorHold event. - * When waiting for a character for 'updatetime' K_CURSORHOLD is put in the - * input buffer. "did_cursorhold" is set to avoid retriggering. - */ --/*ARGSUSED*/ - static void - nv_cursorhold(cap) - cmdarg_T *cap; - { - apply_autocmds(EVENT_CURSORHOLD, NULL, NULL, FALSE, curbuf); ---- vim72.orig/src/ops.c -+++ vim72/src/ops.c -@@ -70,15 +70,15 @@ static struct yankreg *y_previous = NULL - * structure used by block_prep, op_delete and op_yank for blockwise operators - * also op_change, op_shift, op_insert, op_replace - AKelly - */ - struct block_def - { -- int startspaces; /* 'extra' cols of first char */ -- int endspaces; /* 'extra' cols of first char */ -+ int startspaces; /* 'extra' cols before first char */ -+ int endspaces; /* 'extra' cols after last char */ - int textlen; /* chars in block */ -- char_u *textstart; /* pointer to 1st char in block */ -- colnr_T textcol; /* cols of chars (at least part.) in block */ -+ char_u *textstart; /* pointer to 1st char (partially) in block */ -+ colnr_T textcol; /* index of chars (partially) in block */ - colnr_T start_vcol; /* start col of 1st char wholly inside block */ - colnr_T end_vcol; /* start col of 1st char wholly after block */ - #ifdef FEAT_VISUALEXTRA - int is_short; /* TRUE if line is too short to fit in block */ - int is_MAX; /* TRUE if curswant==MAXCOL when starting */ -@@ -380,22 +380,20 @@ shift_block(oap, amount) - oparg_T *oap; - int amount; - { - int left = (oap->op_type == OP_LSHIFT); - int oldstate = State; -- int total, split; -- char_u *newp, *oldp, *midp, *ptr; -+ int total; -+ char_u *newp, *oldp; - int oldcol = curwin->w_cursor.col; - int p_sw = (int)curbuf->b_p_sw; - int p_ts = (int)curbuf->b_p_ts; - struct block_def bd; -- int internal = 0; - int incr; -- colnr_T vcol, col = 0, ws_vcol; -+ colnr_T ws_vcol; - int i = 0, j = 0; - int len; -- - #ifdef FEAT_RIGHTLEFT - int old_p_ri = p_ri; - - p_ri = 0; /* don't want revins in ident */ - #endif -@@ -422,12 +420,13 @@ shift_block(oap, amount) - if (bd.startspaces) - { - #ifdef FEAT_MBYTE - if (has_mbyte) - bd.textstart += (*mb_ptr2len)(bd.textstart); -+ else - #endif -- ++bd.textstart; -+ ++bd.textstart; - } - for ( ; vim_iswhite(*bd.textstart); ) - { - incr = lbr_chartabsize_adv(&bd.textstart, (colnr_T)(bd.start_vcol)); - total += incr; -@@ -454,71 +453,94 @@ shift_block(oap, amount) - /* the end */ - mch_memmove(newp + bd.textcol + i + j, bd.textstart, (size_t)len); - } - else /* left */ - { -- vcol = oap->start_vcol; -- /* walk vcol past ws to be removed */ -- for (midp = oldp + bd.textcol; -- vcol < (oap->start_vcol + total) && vim_iswhite(*midp); ) -- { -- incr = lbr_chartabsize_adv(&midp, (colnr_T)vcol); -- vcol += incr; -- } -- /* internal is the block-internal ws replacing a split TAB */ -- if (vcol > (oap->start_vcol + total)) -- { -- /* we have to split the TAB *(midp-1) */ -- internal = vcol - (oap->start_vcol + total); -- } -- /* if 'expandtab' is not set, use TABs */ -+ colnr_T destination_col; /* column to which text in block will -+ be shifted */ -+ char_u *verbatim_copy_end; /* end of the part of the line which is -+ copied verbatim */ -+ colnr_T verbatim_copy_width;/* the (displayed) width of this part -+ of line */ -+ unsigned fill; /* nr of spaces that replace a TAB */ -+ unsigned new_line_len; /* the length of the line after the -+ block shift */ -+ size_t block_space_width; -+ size_t shift_amount; -+ char_u *non_white = bd.textstart; -+ colnr_T non_white_col; - -- split = bd.startspaces + internal; -- if (split > 0) -- { -- if (!curbuf->b_p_et) -- { -- for (ptr = oldp, col = 0; ptr < oldp+bd.textcol; ) -- col += lbr_chartabsize_adv(&ptr, (colnr_T)col); -+ /* -+ * Firstly, let's find the first non-whitespace character that is -+ * displayed after the block's start column and the character's column -+ * number. Also, let's calculate the width of all the whitespace -+ * characters that are displayed in the block and precede the searched -+ * non-whitespace character. -+ */ - -- /* col+1 now equals the start col of the first char of the -- * block (may be < oap.start_vcol if we're splitting a TAB) */ -- i = ((col % p_ts) + split) / p_ts; /* number of tabs */ -- } -- if (i) -- j = ((col % p_ts) + split) % p_ts; /* number of spp */ -- else -- j = split; -- } -+ /* If "bd.startspaces" is set, "bd.textstart" points to the character, -+ * the part of which is displayed at the block's beginning. Let's start -+ * searching from the next character. */ -+ if (bd.startspaces) -+ mb_ptr_adv(non_white); - -- newp = alloc_check(bd.textcol + i + j + (unsigned)STRLEN(midp) + 1); -- if (newp == NULL) -- return; -- vim_memset(newp, NUL, (size_t)(bd.textcol + i + j + STRLEN(midp) + 1)); -+ /* The character's column is in "bd.start_vcol". */ -+ non_white_col = bd.start_vcol; - -- /* copy first part we want to keep */ -- mch_memmove(newp, oldp, (size_t)bd.textcol); -- /* Now copy any TABS and spp to ensure correct alignment! */ -- while (vim_iswhite(*midp)) -+ while (vim_iswhite(*non_white)) - { -- if (*midp == TAB) -- i++; -- else /*space */ -- j++; -- midp++; -+ incr = lbr_chartabsize_adv(&non_white, non_white_col); -+ non_white_col += incr; - } -- /* We might have an extra TAB worth of spp now! */ -- if (j / p_ts && !curbuf->b_p_et) -+ -+ block_space_width = non_white_col - oap->start_vcol; -+ /* We will shift by "total" or "block_space_width", whichever is less. -+ */ -+ shift_amount = (block_space_width < (size_t)total -+ ? block_space_width : (size_t)total); -+ -+ /* The column to which we will shift the text. */ -+ destination_col = (colnr_T)(non_white_col - shift_amount); -+ -+ /* Now let's find out how much of the beginning of the line we can -+ * reuse without modification. */ -+ verbatim_copy_end = bd.textstart; -+ verbatim_copy_width = bd.start_vcol; -+ -+ /* If "bd.startspaces" is set, "bd.textstart" points to the character -+ * preceding the block. We have to subtract its width to obtain its -+ * column number. */ -+ if (bd.startspaces) -+ verbatim_copy_width -= bd.start_char_vcols; -+ while (verbatim_copy_width < destination_col) - { -- i++; -- j -= p_ts; -+ incr = lbr_chartabsize(verbatim_copy_end, verbatim_copy_width); -+ if (verbatim_copy_width + incr > destination_col) -+ break; -+ verbatim_copy_width += incr; -+ mb_ptr_adv(verbatim_copy_end); - } -- copy_chars(newp + bd.textcol, (size_t)i, TAB); -- copy_spaces(newp + bd.textcol + i, (size_t)j); - -- /* the end */ -- STRMOVE(newp + STRLEN(newp), midp); -+ /* If "destination_col" is different from the width of the initial -+ * part of the line that will be copied, it means we encountered a tab -+ * character, which we will have to partly replace with spaces. */ -+ fill = destination_col - verbatim_copy_width; -+ -+ /* The replacement line will consist of: -+ * - the beginning of the original line up to "verbatim_copy_end", -+ * - "fill" number of spaces, -+ * - the rest of the line, pointed to by non_white. */ -+ new_line_len = (unsigned)(verbatim_copy_end - oldp) -+ + fill -+ + (unsigned)STRLEN(non_white) + 1; -+ -+ newp = alloc_check(new_line_len); -+ if (newp == NULL) -+ return; -+ mch_memmove(newp, oldp, (size_t)(verbatim_copy_end - oldp)); -+ copy_spaces(newp + (verbatim_copy_end - oldp), (size_t)fill); -+ STRMOVE(newp + (verbatim_copy_end - oldp) + fill, non_white); - } - /* replace the line */ - ml_replace(curwin->w_cursor.lnum, newp, FALSE); - changed_bytes(curwin->w_cursor.lnum, (colnr_T)bd.textcol); - State = oldstate; -@@ -1120,10 +1142,12 @@ stuff_yank(regname, p) - y_current->y_type = MCHAR; /* used to be MLINE, why? */ - } - return OK; - } - -+static int execreg_lastc = NUL; -+ - /* - * execute a yank register: copy it into the stuff buffer - * - * return FAIL for failure, OK otherwise - */ -@@ -1132,32 +1156,31 @@ do_execreg(regname, colon, addcr, silent - int regname; - int colon; /* insert ':' before each line */ - int addcr; /* always add '\n' to end of line */ - int silent; /* set "silent" flag in typeahead buffer */ - { -- static int lastc = NUL; - long i; - char_u *p; - int retval = OK; - int remap; - - if (regname == '@') /* repeat previous one */ - { -- if (lastc == NUL) -+ if (execreg_lastc == NUL) - { - EMSG(_("E748: No previously used register")); - return FAIL; - } -- regname = lastc; -+ regname = execreg_lastc; - } - /* check for valid regname */ - if (regname == '%' || regname == '#' || !valid_yank_reg(regname, FALSE)) - { - emsg_invreg(regname); - return FAIL; - } -- lastc = regname; -+ execreg_lastc = regname; - - #ifdef FEAT_CLIPBOARD - regname = may_get_selection(regname); - #endif - -@@ -1276,22 +1299,28 @@ put_reedit_in_typebuf(silent) - if (ins_typebuf(buf, REMAP_NONE, 0, TRUE, silent) == OK) - restart_edit = NUL; - } - } - -+/* -+ * Insert register contents "s" into the typeahead buffer, so that it will be -+ * executed again. -+ * When "esc" is TRUE it is to be taken literally: Escape CSI characters and -+ * no remapping. -+ */ - static int - put_in_typebuf(s, esc, colon, silent) - char_u *s; -- int esc; /* Escape CSI characters */ -+ int esc; - int colon; /* add ':' before the line */ - int silent; - { - int retval = OK; - - put_reedit_in_typebuf(silent); - if (colon) -- retval = ins_typebuf((char_u *)"\n", REMAP_YES, 0, TRUE, silent); -+ retval = ins_typebuf((char_u *)"\n", REMAP_NONE, 0, TRUE, silent); - if (retval == OK) - { - char_u *p; - - if (esc) -@@ -1299,16 +1328,17 @@ put_in_typebuf(s, esc, colon, silent) - else - p = s; - if (p == NULL) - retval = FAIL; - else -- retval = ins_typebuf(p, REMAP_YES, 0, TRUE, silent); -+ retval = ins_typebuf(p, esc ? REMAP_NONE : REMAP_YES, -+ 0, TRUE, silent); - if (esc) - vim_free(p); - } - if (colon && retval == OK) -- retval = ins_typebuf((char_u *)":", REMAP_YES, 0, TRUE, silent); -+ retval = ins_typebuf((char_u *)":", REMAP_NONE, 0, TRUE, silent); - return retval; - } - - /* - * Insert a yank register: copy it into the Read buffer. -@@ -1996,10 +2026,11 @@ op_replace(oap, c) - if (oap->block_mode) - { - bd.is_MAX = (curwin->w_curswant == MAXCOL); - for ( ; curwin->w_cursor.lnum <= oap->end.lnum; ++curwin->w_cursor.lnum) - { -+ curwin->w_cursor.col = 0; /* make sure cursor position is valid */ - block_prep(oap, &bd, curwin->w_cursor.lnum, TRUE); - if (bd.textlen == 0 && (!virtual_op || bd.is_MAX)) - continue; /* nothing to replace */ - - /* n == number of extra chars required -@@ -2011,10 +2042,11 @@ op_replace(oap, c) - * coladd offset as part of "startspaces" */ - if (virtual_op && bd.is_short && *bd.textstart == NUL) - { - pos_T vpos; - -+ vpos.lnum = curwin->w_cursor.lnum; - getvpos(&vpos, oap->start_vcol); - bd.startspaces += vpos.coladd; - n = bd.startspaces; - } - else -@@ -2207,16 +2239,19 @@ op_tilde(oap) - #ifdef FEAT_VISUAL - if (oap->block_mode) /* Visual block mode */ - { - for (; pos.lnum <= oap->end.lnum; ++pos.lnum) - { -+ int one_change; -+ - block_prep(oap, &bd, pos.lnum, FALSE); - pos.col = bd.textcol; -- did_change = swapchars(oap->op_type, &pos, bd.textlen); -+ one_change = swapchars(oap->op_type, &pos, bd.textlen); -+ did_change |= one_change; - - # ifdef FEAT_NETBEANS_INTG -- if (usingNetbeans && did_change) -+ if (usingNetbeans && one_change) - { - char_u *ptr = ml_get_buf(curbuf, pos.lnum, FALSE); - - netbeans_removed(curbuf, pos.lnum, bd.textcol, - (long)bd.textlen); -@@ -2666,15 +2701,12 @@ op_change(oap) - - /* If the block starts in virtual space, count the - * initial coladd offset as part of "startspaces" */ - if (bd.is_short) - { -- linenr_T lnum = curwin->w_cursor.lnum; -- -- curwin->w_cursor.lnum = linenr; -+ vpos.lnum = linenr; - (void)getvpos(&vpos, oap->start_vcol); -- curwin->w_cursor.lnum = lnum; - } - else - vpos.coladd = 0; - # endif - oldp = ml_get(linenr); -@@ -3964,10 +3996,18 @@ ex_display(eap) - else - yb = &(y_regs[0]); - } - else - yb = &(y_regs[i]); -+ -+#ifdef FEAT_EVAL -+ if (name == MB_TOLOWER(redir_reg) -+ || (redir_reg == '"' && yb == y_previous)) -+ continue; /* do not list register being written to, the -+ * pointer can be freed */ -+#endif -+ - if (yb->y_array != NULL) - { - msg_putchar('\n'); - msg_putchar('"'); - msg_putchar(name); -@@ -4446,33 +4486,18 @@ fex_format(lnum, count, c) - int c; /* character to be inserted */ - { - int use_sandbox = was_set_insecurely((char_u *)"formatexpr", - OPT_LOCAL); - int r; --#ifdef FEAT_MBYTE -- char_u buf[MB_MAXBYTES]; --#else -- char_u buf[2]; --#endif - - /* - * Set v:lnum to the first line number and v:count to the number of lines. - * Set v:char to the character to be inserted (can be NUL). - */ - set_vim_var_nr(VV_LNUM, lnum); - set_vim_var_nr(VV_COUNT, count); -- --#ifdef FEAT_MBYTE -- if (has_mbyte) -- buf[(*mb_char2bytes)(c, buf)] = NUL; -- else --#endif -- { -- buf[0] = c; -- buf[1] = NUL; -- } -- set_vim_var_string(VV_CHAR, buf, -1); -+ set_vim_var_char(c); - - /* - * Evaluate the function. - */ - if (use_sandbox) -@@ -4846,11 +4871,12 @@ paragraph_start(lnum) - * - * for delete: - * - textlen includes the first/last char to be (partly) deleted - * - start/endspaces is the number of columns that are taken by the - * first/last deleted char minus the number of columns that have to be -- * deleted. for yank and tilde: -+ * deleted. -+ * for yank and tilde: - * - textlen includes the first/last char to be wholly yanked - * - start/endspaces is the number of columns of the first/last yanked char - * that are to be yanked. - */ - static void -@@ -5310,34 +5336,45 @@ read_viminfo_register(virp, force) - char_u *str; - char_u **array = NULL; - - /* We only get here (hopefully) if line[0] == '"' */ - str = virp->vir_line + 1; -+ -+ /* If the line starts with "" this is the y_previous register. */ - if (*str == '"') - { - set_prev = TRUE; - str++; - } -+ - if (!ASCII_ISALNUM(*str) && *str != '-') - { - if (viminfo_error("E577: ", _("Illegal register name"), virp->vir_line)) - return TRUE; /* too many errors, pretend end-of-file */ - do_it = FALSE; - } - get_yank_register(*str++, FALSE); - if (!force && y_current->y_array != NULL) - do_it = FALSE; -+ -+ if (*str == '@') -+ { -+ /* "x@: register x used for @@ */ -+ if (force || execreg_lastc == NUL) -+ execreg_lastc = str[-1]; -+ } -+ - size = 0; - limit = 100; /* Optimized for registers containing <= 100 lines */ - if (do_it) - { - if (set_prev) - y_previous = y_current; - vim_free(y_current->y_array); - array = y_current->y_array = - (char_u **)alloc((unsigned)(limit * sizeof(char_u *))); -- str = skipwhite(str); -+ str = skipwhite(skiptowhite(str)); - if (STRNCMP(str, "CHAR", 4) == 0) - y_current->y_type = MCHAR; - #ifdef FEAT_VISUAL - else if (STRNCMP(str, "BLOCK", 5) == 0) - y_current->y_type = MBLOCK; -@@ -5416,10 +5453,11 @@ write_viminfo_registers(fp) - if (max_num_lines == 0) - return; - max_kbyte = get_viminfo_parameter('s'); - if (max_kbyte == 0) - return; -+ - for (i = 0; i < NUM_REGISTERS; i++) - { - if (y_regs[i].y_array == NULL) - continue; - #ifdef FEAT_CLIPBOARD -@@ -5470,11 +5508,14 @@ write_viminfo_registers(fp) - break; - } - if (y_previous == &y_regs[i]) - fprintf(fp, "\""); - c = get_register_name(i); -- fprintf(fp, "\"%c\t%s\t%d\n", c, type, -+ fprintf(fp, "\"%c", c); -+ if (c == execreg_lastc) -+ fprintf(fp, "@"); -+ fprintf(fp, "\t%s\t%d\n", type, - #ifdef FEAT_VISUAL - (int)y_regs[i].y_width - #else - 0 - #endif -@@ -5548,10 +5589,36 @@ x11_export_final_selection() - - /* Check it's OK */ - if (dpy != NULL && str != NULL && motion_type >= 0 - && len < 1024*1024 && len > 0) - { -+#ifdef FEAT_MBYTE -+ /* The CUT_BUFFER0 is supposed to always contain latin1. Convert from -+ * 'enc' when it is a multi-byte encoding. When 'enc' is an 8-bit -+ * encoding conversion usually doesn't work, so keep the text as-is. -+ */ -+ if (has_mbyte) -+ { -+ vimconv_T vc; -+ -+ vc.vc_type = CONV_NONE; -+ if (convert_setup(&vc, p_enc, (char_u *)"latin1") == OK) -+ { -+ int intlen = len; -+ char_u *conv_str; -+ -+ conv_str = string_convert(&vc, str, &intlen); -+ len = intlen; -+ if (conv_str != NULL) -+ { -+ vim_free(str); -+ str = conv_str; -+ } -+ convert_setup(&vc, NULL, NULL); -+ } -+ } -+#endif - XStoreBuffer(dpy, (char *)str, (int)len, 0); - XFlush(dpy); - } - - vim_free(str); -@@ -6039,11 +6106,11 @@ str_to_reg(y_ptr, type, str, len, blockl - char_u **pp; - #ifdef FEAT_VISUAL - long maxlen; - #endif - -- if (y_ptr->y_array == NULL) /* NULL means emtpy register */ -+ if (y_ptr->y_array == NULL) /* NULL means empty register */ - y_ptr->y_size = 0; - - /* - * Count the number of lines within the string - */ -@@ -6256,15 +6323,24 @@ cursor_pos_info() - if (*p_sel == 'e' && max_pos.col > 0) - --max_pos.col; - - if (VIsual_mode == Ctrl_V) - { -+#ifdef FEAT_LINEBREAK -+ char_u * saved_sbr = p_sbr; -+ -+ /* Make 'sbr' empty for a moment to get the correct size. */ -+ p_sbr = empty_option; -+#endif - oparg.is_VIsual = 1; - oparg.block_mode = TRUE; - oparg.op_type = OP_NOP; - getvcols(curwin, &min_pos, &max_pos, - &oparg.start_vcol, &oparg.end_vcol); -+#ifdef FEAT_LINEBREAK -+ p_sbr = saved_sbr; -+#endif - if (curwin->w_curswant == MAXCOL) - oparg.end_vcol = MAXCOL; - /* Swap the start, end vcol if needed */ - if (oparg.end_vcol < oparg.start_vcol) - { -@@ -6364,25 +6440,27 @@ cursor_pos_info() - { - if (VIsual_mode == Ctrl_V && curwin->w_curswant < MAXCOL) - { - getvcols(curwin, &min_pos, &max_pos, &min_pos.col, - &max_pos.col); -- sprintf((char *)buf1, _("%ld Cols; "), -+ vim_snprintf((char *)buf1, sizeof(buf1), _("%ld Cols; "), - (long)(oparg.end_vcol - oparg.start_vcol + 1)); - } - else - buf1[0] = NUL; - - if (char_count_cursor == byte_count_cursor - && char_count == byte_count) -- sprintf((char *)IObuff, _("Selected %s%ld of %ld Lines; %ld of %ld Words; %ld of %ld Bytes"), -+ vim_snprintf((char *)IObuff, IOSIZE, -+ _("Selected %s%ld of %ld Lines; %ld of %ld Words; %ld of %ld Bytes"), - buf1, line_count_selected, - (long)curbuf->b_ml.ml_line_count, - word_count_cursor, word_count, - byte_count_cursor, byte_count); - else -- sprintf((char *)IObuff, _("Selected %s%ld of %ld Lines; %ld of %ld Words; %ld of %ld Chars; %ld of %ld Bytes"), -+ vim_snprintf((char *)IObuff, IOSIZE, -+ _("Selected %s%ld of %ld Lines; %ld of %ld Words; %ld of %ld Chars; %ld of %ld Bytes"), - buf1, line_count_selected, - (long)curbuf->b_ml.ml_line_count, - word_count_cursor, word_count, - char_count_cursor, char_count, - byte_count_cursor, byte_count); -@@ -6390,24 +6468,26 @@ cursor_pos_info() - else - #endif - { - p = ml_get_curline(); - validate_virtcol(); -- col_print(buf1, (int)curwin->w_cursor.col + 1, -+ col_print(buf1, sizeof(buf1), (int)curwin->w_cursor.col + 1, - (int)curwin->w_virtcol + 1); -- col_print(buf2, (int)STRLEN(p), linetabsize(p)); -+ col_print(buf2, sizeof(buf2), (int)STRLEN(p), linetabsize(p)); - - if (char_count_cursor == byte_count_cursor - && char_count == byte_count) -- sprintf((char *)IObuff, _("Col %s of %s; Line %ld of %ld; Word %ld of %ld; Byte %ld of %ld"), -+ vim_snprintf((char *)IObuff, IOSIZE, -+ _("Col %s of %s; Line %ld of %ld; Word %ld of %ld; Byte %ld of %ld"), - (char *)buf1, (char *)buf2, - (long)curwin->w_cursor.lnum, - (long)curbuf->b_ml.ml_line_count, - word_count_cursor, word_count, - byte_count_cursor, byte_count); - else -- sprintf((char *)IObuff, _("Col %s of %s; Line %ld of %ld; Word %ld of %ld; Char %ld of %ld; Byte %ld of %ld"), -+ vim_snprintf((char *)IObuff, IOSIZE, -+ _("Col %s of %s; Line %ld of %ld; Word %ld of %ld; Char %ld of %ld; Byte %ld of %ld"), - (char *)buf1, (char *)buf2, - (long)curwin->w_cursor.lnum, - (long)curbuf->b_ml.ml_line_count, - word_count_cursor, word_count, - char_count_cursor, char_count, ---- vim72.orig/src/option.c -+++ vim72/src/option.c -@@ -385,10 +385,13 @@ struct vimoption - idopt_T indir; /* global option: PV_NONE; - * local option: indirect option index */ - char_u *def_val[2]; /* default values for variable (vi and vim) */ - #ifdef FEAT_EVAL - scid_T scriptID; /* script in which the option was last set */ -+# define SCRIPTID_INIT , 0 -+#else -+# define SCRIPTID_INIT - #endif - }; - - #define VI_DEFAULT 0 /* def_val[VI_DEFAULT] is Vi default value */ - #define VIM_DEFAULT 1 /* def_val[VIM_DEFAULT] is Vim default value */ -@@ -398,12 +401,13 @@ struct vimoption - */ - #define P_BOOL 0x01 /* the option is boolean */ - #define P_NUM 0x02 /* the option is numeric */ - #define P_STRING 0x04 /* the option is a string */ - #define P_ALLOCED 0x08 /* the string option is in allocated memory, -- must use vim_free() when assigning new -- value. Not set if default is the same. */ -+ must use free_string_option() when -+ assigning new value. Not set if default is -+ the same. */ - #define P_EXPAND 0x10 /* environment expansion. NOTE: P_EXPAND can - never be used for local or hidden options! */ - #define P_NODEFAULT 0x40 /* don't set to default value */ - #define P_DEF_ALLOCED 0x80 /* default value is in allocated memory, must - use vim_free() when assigning new value */ -@@ -475,263 +479,263 @@ static struct vimoption - #if (defined(MSDOS) || defined(WIN3264) || defined(OS2)) && !defined(FEAT_GUI_W32) - (char_u *)128L, - #else - (char_u *)224L, - #endif -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"antialias", "anti", P_BOOL|P_VI_DEF|P_VIM|P_RCLR, - #if defined(FEAT_GUI) && defined(MACOS_X) - (char_u *)&p_antialias, PV_NONE, - {(char_u *)FALSE, (char_u *)FALSE} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)FALSE, (char_u *)FALSE} - #endif -- }, -+ SCRIPTID_INIT}, - {"arabic", "arab", P_BOOL|P_VI_DEF|P_VIM, - #ifdef FEAT_ARABIC - (char_u *)VAR_WIN, PV_ARAB, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"arabicshape", "arshape", P_BOOL|P_VI_DEF|P_VIM|P_RCLR, - #ifdef FEAT_ARABIC - (char_u *)&p_arshape, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"allowrevins", "ari", P_BOOL|P_VI_DEF|P_VIM, - #ifdef FEAT_RIGHTLEFT - (char_u *)&p_ari, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"altkeymap", "akm", P_BOOL|P_VI_DEF, - #ifdef FEAT_FKMAP - (char_u *)&p_altkeymap, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"ambiwidth", "ambw", P_STRING|P_VI_DEF|P_RCLR, - #if defined(FEAT_MBYTE) - (char_u *)&p_ambw, PV_NONE, - {(char_u *)"single", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - #ifdef FEAT_AUTOCHDIR - {"autochdir", "acd", P_BOOL|P_VI_DEF, - (char_u *)&p_acd, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - #endif - {"autoindent", "ai", P_BOOL|P_VI_DEF, - (char_u *)&p_ai, PV_AI, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"autoprint", "ap", P_BOOL|P_VI_DEF, - (char_u *)NULL, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"autoread", "ar", P_BOOL|P_VI_DEF, - (char_u *)&p_ar, PV_AR, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"autowrite", "aw", P_BOOL|P_VI_DEF, - (char_u *)&p_aw, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"autowriteall","awa", P_BOOL|P_VI_DEF, - (char_u *)&p_awa, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"background", "bg", P_STRING|P_VI_DEF|P_RCLR, - (char_u *)&p_bg, PV_NONE, - { - #if (defined(MSDOS) || defined(OS2) || defined(WIN3264)) && !defined(FEAT_GUI) - (char_u *)"dark", - #else - (char_u *)"light", - #endif -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"backspace", "bs", P_STRING|P_VI_DEF|P_VIM|P_COMMA|P_NODUP, - (char_u *)&p_bs, PV_NONE, -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"backup", "bk", P_BOOL|P_VI_DEF|P_VIM, - (char_u *)&p_bk, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"backupcopy", "bkc", P_STRING|P_VIM|P_COMMA|P_NODUP, - (char_u *)&p_bkc, PV_NONE, - #ifdef UNIX - {(char_u *)"yes", (char_u *)"auto"} - #else - {(char_u *)"auto", (char_u *)"auto"} - #endif -- }, -+ SCRIPTID_INIT}, - {"backupdir", "bdir", P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP|P_SECURE, - (char_u *)&p_bdir, PV_NONE, -- {(char_u *)DFLT_BDIR, (char_u *)0L}}, -+ {(char_u *)DFLT_BDIR, (char_u *)0L} SCRIPTID_INIT}, - {"backupext", "bex", P_STRING|P_VI_DEF|P_NFNAME, - (char_u *)&p_bex, PV_NONE, - { - #ifdef VMS - (char_u *)"_", - #else - (char_u *)"~", - #endif -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"backupskip", "bsk", P_STRING|P_VI_DEF|P_COMMA, - #ifdef FEAT_WILDIGN - (char_u *)&p_bsk, PV_NONE, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - #ifdef FEAT_BEVAL - {"balloondelay","bdlay",P_NUM|P_VI_DEF, - (char_u *)&p_bdlay, PV_NONE, -- {(char_u *)600L, (char_u *)0L}}, -+ {(char_u *)600L, (char_u *)0L} SCRIPTID_INIT}, - {"ballooneval", "beval",P_BOOL|P_VI_DEF|P_NO_MKRC, - (char_u *)&p_beval, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - # ifdef FEAT_EVAL - {"balloonexpr", "bexpr", P_STRING|P_ALLOCED|P_VI_DEF|P_VIM, - (char_u *)&p_bexpr, PV_BEXPR, -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - # endif - #endif - {"beautify", "bf", P_BOOL|P_VI_DEF, - (char_u *)NULL, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"binary", "bin", P_BOOL|P_VI_DEF|P_RSTAT, - (char_u *)&p_bin, PV_BIN, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"bioskey", "biosk",P_BOOL|P_VI_DEF, - #ifdef MSDOS - (char_u *)&p_biosk, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"bomb", NULL, P_BOOL|P_NO_MKRC|P_VI_DEF|P_RSTAT, - #ifdef FEAT_MBYTE - (char_u *)&p_bomb, PV_BOMB, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"breakat", "brk", P_STRING|P_VI_DEF|P_RALL|P_FLAGLIST, - #ifdef FEAT_LINEBREAK - (char_u *)&p_breakat, PV_NONE, - {(char_u *)" \t!@*-+;:,./?", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"browsedir", "bsdir",P_STRING|P_VI_DEF, - #ifdef FEAT_BROWSE - (char_u *)&p_bsdir, PV_NONE, - {(char_u *)"last", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"bufhidden", "bh", P_STRING|P_ALLOCED|P_VI_DEF|P_NOGLOB, - #if defined(FEAT_QUICKFIX) - (char_u *)&p_bh, PV_BH, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"buflisted", "bl", P_BOOL|P_VI_DEF|P_NOGLOB, - (char_u *)&p_bl, PV_BL, - {(char_u *)1L, (char_u *)0L} -- }, -+ SCRIPTID_INIT}, - {"buftype", "bt", P_STRING|P_ALLOCED|P_VI_DEF|P_NOGLOB, - #if defined(FEAT_QUICKFIX) - (char_u *)&p_bt, PV_BT, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"casemap", "cmp", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_MBYTE - (char_u *)&p_cmp, PV_NONE, - {(char_u *)"internal,keepascii", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"cdpath", "cd", P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_SEARCHPATH - (char_u *)&p_cdpath, PV_NONE, - {(char_u *)",,", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"cedit", NULL, P_STRING, - #ifdef FEAT_CMDWIN - (char_u *)&p_cedit, PV_NONE, - {(char_u *)"", (char_u *)CTRL_F_STR} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"charconvert", "ccv", P_STRING|P_VI_DEF|P_SECURE, - #if defined(FEAT_MBYTE) && defined(FEAT_EVAL) - (char_u *)&p_ccv, PV_NONE, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"cindent", "cin", P_BOOL|P_VI_DEF|P_VIM, - #ifdef FEAT_CINDENT - (char_u *)&p_cin, PV_CIN, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"cinkeys", "cink", P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_CINDENT - (char_u *)&p_cink, PV_CINK, - {(char_u *)"0{,0},0),:,0#,!^F,o,O,e", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"cinoptions", "cino", P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_CINDENT - (char_u *)&p_cino, PV_CINO, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"cinwords", "cinw", P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP, - #if defined(FEAT_SMARTINDENT) || defined(FEAT_CINDENT) - (char_u *)&p_cinw, PV_CINW, - {(char_u *)"if,else,while,do,for,switch", - (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"clipboard", "cb", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_CLIPBOARD - (char_u *)&p_cb, PV_NONE, - # ifdef FEAT_XCLIPBOARD - {(char_u *)"autoselect,exclude:cons\\|linux", -@@ -741,435 +745,440 @@ static struct vimoption - # endif - #else - (char_u *)NULL, PV_NONE, - {(char_u *)"", (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"cmdheight", "ch", P_NUM|P_VI_DEF|P_RALL, - (char_u *)&p_ch, PV_NONE, -- {(char_u *)1L, (char_u *)0L}}, -+ {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT}, - {"cmdwinheight", "cwh", P_NUM|P_VI_DEF, - #ifdef FEAT_CMDWIN - (char_u *)&p_cwh, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)7L, (char_u *)0L}}, -+ {(char_u *)7L, (char_u *)0L} SCRIPTID_INIT}, - {"columns", "co", P_NUM|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RCLR, - (char_u *)&Columns, PV_NONE, -- {(char_u *)80L, (char_u *)0L}}, -+ {(char_u *)80L, (char_u *)0L} SCRIPTID_INIT}, - {"comments", "com", P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_COMMENTS - (char_u *)&p_com, PV_COM, - {(char_u *)"s1:/*,mb:*,ex:*/,://,b:#,:%,:XCOMM,n:>,fb:-", - (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"commentstring", "cms", P_STRING|P_ALLOCED|P_VI_DEF, - #ifdef FEAT_FOLDING - (char_u *)&p_cms, PV_CMS, - {(char_u *)"/*%s*/", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - /* P_PRI_MKRC isn't needed here, optval_default() - * always returns TRUE for 'compatible' */ - {"compatible", "cp", P_BOOL|P_RALL, - (char_u *)&p_cp, PV_NONE, -- {(char_u *)TRUE, (char_u *)FALSE}}, -+ {(char_u *)TRUE, (char_u *)FALSE} SCRIPTID_INIT}, - {"complete", "cpt", P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_INS_EXPAND - (char_u *)&p_cpt, PV_CPT, - {(char_u *)".,w,b,u,t,i", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"completefunc", "cfu", P_STRING|P_ALLOCED|P_VI_DEF|P_SECURE, - #ifdef FEAT_COMPL_FUNC - (char_u *)&p_cfu, PV_CFU, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"completeopt", "cot", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_INS_EXPAND - (char_u *)&p_cot, PV_NONE, - {(char_u *)"menu,preview", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"confirm", "cf", P_BOOL|P_VI_DEF, - #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG) - (char_u *)&p_confirm, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"conskey", "consk",P_BOOL|P_VI_DEF, - #ifdef MSDOS - (char_u *)&p_consk, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"copyindent", "ci", P_BOOL|P_VI_DEF|P_VIM, - (char_u *)&p_ci, PV_CI, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"cpoptions", "cpo", P_STRING|P_VIM|P_RALL|P_FLAGLIST, - (char_u *)&p_cpo, PV_NONE, -- {(char_u *)CPO_VI, (char_u *)CPO_VIM}}, -+ {(char_u *)CPO_VI, (char_u *)CPO_VIM} -+ SCRIPTID_INIT}, - {"cscopepathcomp", "cspc", P_NUM|P_VI_DEF|P_VIM, - #ifdef FEAT_CSCOPE - (char_u *)&p_cspc, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"cscopeprg", "csprg", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE, - #ifdef FEAT_CSCOPE - (char_u *)&p_csprg, PV_NONE, - {(char_u *)"cscope", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"cscopequickfix", "csqf", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - #if defined(FEAT_CSCOPE) && defined(FEAT_QUICKFIX) - (char_u *)&p_csqf, PV_NONE, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"cscopetag", "cst", P_BOOL|P_VI_DEF|P_VIM, - #ifdef FEAT_CSCOPE - (char_u *)&p_cst, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"cscopetagorder", "csto", P_NUM|P_VI_DEF|P_VIM, - #ifdef FEAT_CSCOPE - (char_u *)&p_csto, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"cscopeverbose", "csverb", P_BOOL|P_VI_DEF|P_VIM, - #ifdef FEAT_CSCOPE - (char_u *)&p_csverbose, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"cursorcolumn", "cuc", P_BOOL|P_VI_DEF|P_RWIN, - #ifdef FEAT_SYN_HL - (char_u *)VAR_WIN, PV_CUC, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"cursorline", "cul", P_BOOL|P_VI_DEF|P_RWIN, - #ifdef FEAT_SYN_HL - (char_u *)VAR_WIN, PV_CUL, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"debug", NULL, P_STRING|P_VI_DEF, - (char_u *)&p_debug, PV_NONE, -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"define", "def", P_STRING|P_ALLOCED|P_VI_DEF, - #ifdef FEAT_FIND_ID - (char_u *)&p_def, PV_DEF, - {(char_u *)"^\\s*#\\s*define", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"delcombine", "deco", P_BOOL|P_VI_DEF|P_VIM, - #ifdef FEAT_MBYTE - (char_u *)&p_deco, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"dictionary", "dict", P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_INS_EXPAND - (char_u *)&p_dict, PV_DICT, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"diff", NULL, P_BOOL|P_VI_DEF|P_RWIN|P_NOGLOB, - #ifdef FEAT_DIFF - (char_u *)VAR_WIN, PV_DIFF, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"diffexpr", "dex", P_STRING|P_VI_DEF|P_SECURE, - #if defined(FEAT_DIFF) && defined(FEAT_EVAL) - (char_u *)&p_dex, PV_NONE, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"diffopt", "dip", P_STRING|P_ALLOCED|P_VI_DEF|P_RWIN|P_COMMA|P_NODUP, - #ifdef FEAT_DIFF - (char_u *)&p_dip, PV_NONE, - {(char_u *)"filler", (char_u *)NULL} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)"", (char_u *)NULL} - #endif -- }, -+ SCRIPTID_INIT}, - {"digraph", "dg", P_BOOL|P_VI_DEF|P_VIM, - #ifdef FEAT_DIGRAPHS - (char_u *)&p_dg, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"directory", "dir", P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP|P_SECURE, - (char_u *)&p_dir, PV_NONE, -- {(char_u *)DFLT_DIR, (char_u *)0L}}, -+ {(char_u *)DFLT_DIR, (char_u *)0L} SCRIPTID_INIT}, - {"display", "dy", P_STRING|P_VI_DEF|P_COMMA|P_RALL|P_NODUP, - (char_u *)&p_dy, PV_NONE, -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"eadirection", "ead", P_STRING|P_VI_DEF, - #ifdef FEAT_VERTSPLIT - (char_u *)&p_ead, PV_NONE, - {(char_u *)"both", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"edcompatible","ed", P_BOOL|P_VI_DEF, - (char_u *)&p_ed, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"encoding", "enc", P_STRING|P_VI_DEF|P_RCLR, - #ifdef FEAT_MBYTE - (char_u *)&p_enc, PV_NONE, - {(char_u *)ENC_DFLT, (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"endofline", "eol", P_BOOL|P_NO_MKRC|P_VI_DEF|P_RSTAT, - (char_u *)&p_eol, PV_EOL, -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"equalalways", "ea", P_BOOL|P_VI_DEF|P_RALL, - (char_u *)&p_ea, PV_NONE, -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"equalprg", "ep", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE, - (char_u *)&p_ep, PV_EP, -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"errorbells", "eb", P_BOOL|P_VI_DEF, - (char_u *)&p_eb, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"errorfile", "ef", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE, - #ifdef FEAT_QUICKFIX - (char_u *)&p_ef, PV_NONE, - {(char_u *)DFLT_ERRORFILE, (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"errorformat", "efm", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_QUICKFIX - (char_u *)&p_efm, PV_EFM, -- {(char_u *)DFLT_EFM, (char_u *)0L}, -+ {(char_u *)DFLT_EFM, (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"esckeys", "ek", P_BOOL|P_VIM, - (char_u *)&p_ek, PV_NONE, -- {(char_u *)FALSE, (char_u *)TRUE}}, -+ {(char_u *)FALSE, (char_u *)TRUE} SCRIPTID_INIT}, - {"eventignore", "ei", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_AUTOCMD - (char_u *)&p_ei, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"expandtab", "et", P_BOOL|P_VI_DEF|P_VIM, - (char_u *)&p_et, PV_ET, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"exrc", "ex", P_BOOL|P_VI_DEF|P_SECURE, - (char_u *)&p_exrc, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"fileencoding","fenc", P_STRING|P_ALLOCED|P_VI_DEF|P_RSTAT|P_RBUF|P_NO_MKRC, - #ifdef FEAT_MBYTE - (char_u *)&p_fenc, PV_FENC, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"fileencodings","fencs", P_STRING|P_VI_DEF|P_COMMA, - #ifdef FEAT_MBYTE - (char_u *)&p_fencs, PV_NONE, - {(char_u *)"ucs-bom", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"fileformat", "ff", P_STRING|P_ALLOCED|P_VI_DEF|P_RSTAT|P_NO_MKRC, - (char_u *)&p_ff, PV_FF, -- {(char_u *)DFLT_FF, (char_u *)0L}}, -+ {(char_u *)DFLT_FF, (char_u *)0L} SCRIPTID_INIT}, - {"fileformats", "ffs", P_STRING|P_VIM|P_COMMA|P_NODUP, - (char_u *)&p_ffs, PV_NONE, -- {(char_u *)DFLT_FFS_VI, (char_u *)DFLT_FFS_VIM}}, -+ {(char_u *)DFLT_FFS_VI, (char_u *)DFLT_FFS_VIM} -+ SCRIPTID_INIT}, - {"filetype", "ft", P_STRING|P_ALLOCED|P_VI_DEF|P_NOGLOB|P_NFNAME, - #ifdef FEAT_AUTOCMD - (char_u *)&p_ft, PV_FT, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"fillchars", "fcs", P_STRING|P_VI_DEF|P_RALL|P_COMMA|P_NODUP, - #if defined(FEAT_WINDOWS) || defined(FEAT_FOLDING) - (char_u *)&p_fcs, PV_NONE, - {(char_u *)"vert:|,fold:-", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)"", (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"fkmap", "fk", P_BOOL|P_VI_DEF, - #ifdef FEAT_FKMAP - (char_u *)&p_fkmap, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"flash", "fl", P_BOOL|P_VI_DEF, - (char_u *)NULL, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - #ifdef FEAT_FOLDING - {"foldclose", "fcl", P_STRING|P_VI_DEF|P_COMMA|P_NODUP|P_RWIN, - (char_u *)&p_fcl, PV_NONE, -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"foldcolumn", "fdc", P_NUM|P_VI_DEF|P_RWIN, - (char_u *)VAR_WIN, PV_FDC, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"foldenable", "fen", P_BOOL|P_VI_DEF|P_RWIN, - (char_u *)VAR_WIN, PV_FEN, -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"foldexpr", "fde", P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|P_RWIN, - # ifdef FEAT_EVAL - (char_u *)VAR_WIN, PV_FDE, - {(char_u *)"0", (char_u *)NULL} - # else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - # endif -- }, -+ SCRIPTID_INIT}, - {"foldignore", "fdi", P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|P_RWIN, - (char_u *)VAR_WIN, PV_FDI, -- {(char_u *)"#", (char_u *)NULL}}, -+ {(char_u *)"#", (char_u *)NULL} SCRIPTID_INIT}, - {"foldlevel", "fdl", P_NUM|P_VI_DEF|P_RWIN, - (char_u *)VAR_WIN, PV_FDL, -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"foldlevelstart","fdls", P_NUM|P_VI_DEF, - (char_u *)&p_fdls, PV_NONE, -- {(char_u *)-1L, (char_u *)0L}}, -+ {(char_u *)-1L, (char_u *)0L} SCRIPTID_INIT}, - {"foldmarker", "fmr", P_STRING|P_ALLOCED|P_VIM|P_VI_DEF| - P_RWIN|P_COMMA|P_NODUP, - (char_u *)VAR_WIN, PV_FMR, -- {(char_u *)"{{{,}}}", (char_u *)NULL}}, -+ {(char_u *)"{{{,}}}", (char_u *)NULL} -+ SCRIPTID_INIT}, - {"foldmethod", "fdm", P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|P_RWIN, - (char_u *)VAR_WIN, PV_FDM, -- {(char_u *)"manual", (char_u *)NULL}}, -+ {(char_u *)"manual", (char_u *)NULL} SCRIPTID_INIT}, - {"foldminlines","fml", P_NUM|P_VI_DEF|P_RWIN, - (char_u *)VAR_WIN, PV_FML, -- {(char_u *)1L, (char_u *)0L}}, -+ {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT}, - {"foldnestmax", "fdn", P_NUM|P_VI_DEF|P_RWIN, - (char_u *)VAR_WIN, PV_FDN, -- {(char_u *)20L, (char_u *)0L}}, -+ {(char_u *)20L, (char_u *)0L} SCRIPTID_INIT}, - {"foldopen", "fdo", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - (char_u *)&p_fdo, PV_NONE, - {(char_u *)"block,hor,mark,percent,quickfix,search,tag,undo", -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"foldtext", "fdt", P_STRING|P_ALLOCED|P_VIM|P_VI_DEF|P_RWIN, - # ifdef FEAT_EVAL - (char_u *)VAR_WIN, PV_FDT, - {(char_u *)"foldtext()", (char_u *)NULL} - # else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - # endif -- }, -+ SCRIPTID_INIT}, - #endif - {"formatexpr", "fex", P_STRING|P_ALLOCED|P_VI_DEF|P_VIM, - #ifdef FEAT_EVAL - (char_u *)&p_fex, PV_FEX, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"formatoptions","fo", P_STRING|P_ALLOCED|P_VIM|P_FLAGLIST, - (char_u *)&p_fo, PV_FO, -- {(char_u *)DFLT_FO_VI, (char_u *)DFLT_FO_VIM}}, -+ {(char_u *)DFLT_FO_VI, (char_u *)DFLT_FO_VIM} -+ SCRIPTID_INIT}, - {"formatlistpat","flp", P_STRING|P_ALLOCED|P_VI_DEF, - (char_u *)&p_flp, PV_FLP, -- {(char_u *)"^\\s*\\d\\+[\\]:.)}\\t ]\\s*", (char_u *)0L}}, -+ {(char_u *)"^\\s*\\d\\+[\\]:.)}\\t ]\\s*", -+ (char_u *)0L} SCRIPTID_INIT}, - {"formatprg", "fp", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE, - (char_u *)&p_fp, PV_NONE, -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"fsync", "fs", P_BOOL|P_SECURE|P_VI_DEF, - #ifdef HAVE_FSYNC - (char_u *)&p_fs, PV_NONE, - {(char_u *)TRUE, (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)FALSE, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"gdefault", "gd", P_BOOL|P_VI_DEF|P_VIM, - (char_u *)&p_gd, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"graphic", "gr", P_BOOL|P_VI_DEF, - (char_u *)NULL, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"grepformat", "gfm", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_QUICKFIX - (char_u *)&p_gefm, PV_NONE, -- {(char_u *)DFLT_GREPFORMAT, (char_u *)0L}, -+ {(char_u *)DFLT_GREPFORMAT, (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"grepprg", "gp", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE, - #ifdef FEAT_QUICKFIX - (char_u *)&p_gp, PV_GP, - { - # ifdef WIN3264 -@@ -1183,19 +1192,19 @@ static struct vimoption - # else - # ifdef VMS - (char_u *)"SEARCH/NUMBERS ", - # else - (char_u *)"grep -n ", --#endif --#endif -+# endif -+# endif - # endif -- (char_u *)0L}, -+ (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"guicursor", "gcr", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef CURSOR_SHAPE - (char_u *)&p_guicursor, PV_NONE, - { - # ifdef FEAT_GUI -@@ -1206,45 +1215,45 @@ static struct vimoption - (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"guifont", "gfn", P_STRING|P_VI_DEF|P_RCLR|P_COMMA|P_NODUP, - #ifdef FEAT_GUI - (char_u *)&p_guifont, PV_NONE, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"guifontset", "gfs", P_STRING|P_VI_DEF|P_RCLR|P_COMMA, - #if defined(FEAT_GUI) && defined(FEAT_XFONTSET) - (char_u *)&p_guifontset, PV_NONE, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"guifontwide", "gfw", P_STRING|P_VI_DEF|P_RCLR|P_COMMA|P_NODUP, - #if defined(FEAT_GUI) && defined(FEAT_MBYTE) - (char_u *)&p_guifontwide, PV_NONE, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"guiheadroom", "ghr", P_NUM|P_VI_DEF, - #if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11) - (char_u *)&p_ghr, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)50L, (char_u *)0L}}, -+ {(char_u *)50L, (char_u *)0L} SCRIPTID_INIT}, - {"guioptions", "go", P_STRING|P_VI_DEF|P_RALL|P_FLAGLIST, - #if defined(FEAT_GUI) - (char_u *)&p_go, PV_NONE, - # if defined(UNIX) && !defined(MACOS) - {(char_u *)"aegimrLtT", (char_u *)0L} -@@ -1253,115 +1262,117 @@ static struct vimoption - # endif - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"guipty", NULL, P_BOOL|P_VI_DEF, - #if defined(FEAT_GUI) - (char_u *)&p_guipty, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"guitablabel", "gtl", P_STRING|P_VI_DEF|P_RWIN, - #if defined(FEAT_GUI_TABLINE) - (char_u *)&p_gtl, PV_NONE, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"guitabtooltip", "gtt", P_STRING|P_VI_DEF|P_RWIN, - #if defined(FEAT_GUI_TABLINE) - (char_u *)&p_gtt, PV_NONE, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"hardtabs", "ht", P_NUM|P_VI_DEF, - (char_u *)NULL, PV_NONE, -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"helpfile", "hf", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE, - (char_u *)&p_hf, PV_NONE, -- {(char_u *)DFLT_HELPFILE, (char_u *)0L}}, -+ {(char_u *)DFLT_HELPFILE, (char_u *)0L} -+ SCRIPTID_INIT}, - {"helpheight", "hh", P_NUM|P_VI_DEF, - #ifdef FEAT_WINDOWS - (char_u *)&p_hh, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)20L, (char_u *)0L}}, -+ {(char_u *)20L, (char_u *)0L} SCRIPTID_INIT}, - {"helplang", "hlg", P_STRING|P_VI_DEF|P_COMMA, - #ifdef FEAT_MULTI_LANG - (char_u *)&p_hlg, PV_NONE, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"hidden", "hid", P_BOOL|P_VI_DEF, - (char_u *)&p_hid, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"highlight", "hl", P_STRING|P_VI_DEF|P_RCLR|P_COMMA|P_NODUP, - (char_u *)&p_hl, PV_NONE, -- {(char_u *)HIGHLIGHT_INIT, (char_u *)0L}}, -+ {(char_u *)HIGHLIGHT_INIT, (char_u *)0L} -+ SCRIPTID_INIT}, - {"history", "hi", P_NUM|P_VIM, - (char_u *)&p_hi, PV_NONE, -- {(char_u *)0L, (char_u *)20L}}, -+ {(char_u *)0L, (char_u *)20L} SCRIPTID_INIT}, - {"hkmap", "hk", P_BOOL|P_VI_DEF|P_VIM, - #ifdef FEAT_RIGHTLEFT - (char_u *)&p_hkmap, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"hkmapp", "hkp", P_BOOL|P_VI_DEF|P_VIM, - #ifdef FEAT_RIGHTLEFT - (char_u *)&p_hkmapp, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"hlsearch", "hls", P_BOOL|P_VI_DEF|P_VIM|P_RALL, - (char_u *)&p_hls, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"icon", NULL, P_BOOL|P_VI_DEF, - #ifdef FEAT_TITLE - (char_u *)&p_icon, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"iconstring", NULL, P_STRING|P_VI_DEF, - #ifdef FEAT_TITLE - (char_u *)&p_iconstring, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"ignorecase", "ic", P_BOOL|P_VI_DEF, - (char_u *)&p_ic, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"imactivatekey","imak",P_STRING|P_VI_DEF, - #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK) - (char_u *)&p_imak, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"imcmdline", "imc", P_BOOL|P_VI_DEF, - #ifdef USE_IM_CONTROL - (char_u *)&p_imcmdline, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"imdisable", "imd", P_BOOL|P_VI_DEF, - #ifdef USE_IM_CONTROL - (char_u *)&p_imdisable, PV_NONE, - #else - (char_u *)NULL, PV_NONE, -@@ -1369,72 +1380,72 @@ static struct vimoption - #ifdef __sgi - {(char_u *)TRUE, (char_u *)0L} - #else - {(char_u *)FALSE, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"iminsert", "imi", P_NUM|P_VI_DEF, - (char_u *)&p_iminsert, PV_IMI, - #ifdef B_IMODE_IM - {(char_u *)B_IMODE_IM, (char_u *)0L} - #else - {(char_u *)B_IMODE_NONE, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"imsearch", "ims", P_NUM|P_VI_DEF, - (char_u *)&p_imsearch, PV_IMS, - #ifdef B_IMODE_IM - {(char_u *)B_IMODE_IM, (char_u *)0L} - #else - {(char_u *)B_IMODE_NONE, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"include", "inc", P_STRING|P_ALLOCED|P_VI_DEF, - #ifdef FEAT_FIND_ID - (char_u *)&p_inc, PV_INC, - {(char_u *)"^\\s*#\\s*include", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"includeexpr", "inex", P_STRING|P_ALLOCED|P_VI_DEF, - #if defined(FEAT_FIND_ID) && defined(FEAT_EVAL) - (char_u *)&p_inex, PV_INEX, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"incsearch", "is", P_BOOL|P_VI_DEF|P_VIM, - (char_u *)&p_is, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"indentexpr", "inde", P_STRING|P_ALLOCED|P_VI_DEF|P_VIM, - #if defined(FEAT_CINDENT) && defined(FEAT_EVAL) - (char_u *)&p_inde, PV_INDE, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"indentkeys", "indk", P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP, - #if defined(FEAT_CINDENT) && defined(FEAT_EVAL) - (char_u *)&p_indk, PV_INDK, - {(char_u *)"0{,0},:,0#,!^F,o,O,e", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"infercase", "inf", P_BOOL|P_VI_DEF, - (char_u *)&p_inf, PV_INF, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"insertmode", "im", P_BOOL|P_VI_DEF|P_VIM, - (char_u *)&p_im, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"isfname", "isf", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - (char_u *)&p_isf, PV_NONE, - { - #ifdef BACKSLASH_IN_FILENAME - /* Excluded are: & and ^ are special in cmd.exe -@@ -1453,11 +1464,11 @@ static struct vimoption - (char_u *)"@,48-57,/,.,-,_,+,,,#,$,%,~,=", - # endif - # endif - # endif - #endif -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"isident", "isi", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - (char_u *)&p_isi, PV_NONE, - { - #if defined(MSDOS) || defined(MSWIN) || defined(OS2) - (char_u *)"@,48-57,_,128-167,224-235", -@@ -1470,11 +1481,11 @@ static struct vimoption - "251-254", - # else - (char_u *)"@,48-57,_,192-255", - # endif - #endif -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"iskeyword", "isk", P_STRING|P_ALLOCED|P_VIM|P_COMMA|P_NODUP, - (char_u *)&p_isk, PV_ISK, - { - #ifdef EBCDIC - (char_u *)"@,240-249,_", -@@ -1489,11 +1500,11 @@ static struct vimoption - (char_u *)"@,48-57,_,128-167,224-235" - # else - ISK_LATIN1 - # endif - #endif -- }}, -+ } SCRIPTID_INIT}, - {"isprint", "isp", P_STRING|P_VI_DEF|P_RALL|P_COMMA|P_NODUP, - (char_u *)&p_isp, PV_NONE, - { - #if defined(MSDOS) || defined(MSWIN) || defined(OS2) \ - || (defined(MACOS) && !defined(MACOS_X)) \ -@@ -1505,39 +1516,39 @@ static struct vimoption - (char_u *)"63-255", - # else - ISP_LATIN1, - # endif - #endif -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"joinspaces", "js", P_BOOL|P_VI_DEF|P_VIM, - (char_u *)&p_js, PV_NONE, -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"key", NULL, P_STRING|P_ALLOCED|P_VI_DEF|P_NO_MKRC, - #ifdef FEAT_CRYPT - (char_u *)&p_key, PV_KEY, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"keymap", "kmp", P_STRING|P_ALLOCED|P_VI_DEF|P_RBUF|P_RSTAT|P_NFNAME|P_PRI_MKRC, - #ifdef FEAT_KEYMAP - (char_u *)&p_keymap, PV_KMAP, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)"", (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"keymodel", "km", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_VISUAL - (char_u *)&p_km, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"keywordprg", "kp", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE, - (char_u *)&p_kp, PV_KP, - { - #if defined(MSDOS) || defined(MSWIN) - (char_u *)":help", -@@ -1554,53 +1565,53 @@ static struct vimoption - (char_u *)"man", - # endif - # endif - #endif - #endif -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"langmap", "lmap", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_LANGMAP - (char_u *)&p_langmap, PV_NONE, - {(char_u *)"", /* unmatched } */ - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, - #endif -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"langmenu", "lm", P_STRING|P_VI_DEF|P_NFNAME, - #if defined(FEAT_MENU) && defined(FEAT_MULTI_LANG) - (char_u *)&p_lm, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"laststatus", "ls", P_NUM|P_VI_DEF|P_RALL, - #ifdef FEAT_WINDOWS - (char_u *)&p_ls, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)1L, (char_u *)0L}}, -+ {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT}, - {"lazyredraw", "lz", P_BOOL|P_VI_DEF, - (char_u *)&p_lz, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"linebreak", "lbr", P_BOOL|P_VI_DEF|P_RWIN, - #ifdef FEAT_LINEBREAK - (char_u *)VAR_WIN, PV_LBR, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"lines", NULL, P_NUM|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RCLR, - (char_u *)&Rows, PV_NONE, - { - #if defined(MSDOS) || defined(WIN3264) || defined(OS2) - (char_u *)25L, - #else - (char_u *)24L, - #endif -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"linespace", "lsp", P_NUM|P_VI_DEF|P_RCLR, - #ifdef FEAT_GUI - (char_u *)&p_linespace, PV_NONE, - #else - (char_u *)NULL, PV_NONE, -@@ -1608,53 +1619,53 @@ static struct vimoption - #ifdef FEAT_GUI_W32 - {(char_u *)1L, (char_u *)0L} - #else - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"lisp", NULL, P_BOOL|P_VI_DEF, - #ifdef FEAT_LISP - (char_u *)&p_lisp, PV_LISP, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"lispwords", "lw", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_LISP - (char_u *)&p_lispwords, PV_NONE, - {(char_u *)LISPWORD_VALUE, (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)"", (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"list", NULL, P_BOOL|P_VI_DEF|P_RWIN, - (char_u *)VAR_WIN, PV_LIST, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"listchars", "lcs", P_STRING|P_VI_DEF|P_RALL|P_COMMA|P_NODUP, - (char_u *)&p_lcs, PV_NONE, -- {(char_u *)"eol:$", (char_u *)0L}}, -+ {(char_u *)"eol:$", (char_u *)0L} SCRIPTID_INIT}, - {"loadplugins", "lpl", P_BOOL|P_VI_DEF, - (char_u *)&p_lpl, PV_NONE, -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - #ifdef FEAT_GUI_MAC - {"macatsui", NULL, P_BOOL|P_VI_DEF|P_RCLR, - (char_u *)&p_macatsui, PV_NONE, -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - #endif - {"magic", NULL, P_BOOL|P_VI_DEF, - (char_u *)&p_magic, PV_NONE, -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"makeef", "mef", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE, - #ifdef FEAT_QUICKFIX - (char_u *)&p_mef, PV_NONE, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"makeprg", "mp", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE, - #ifdef FEAT_QUICKFIX - (char_u *)&p_mp, PV_MP, - # ifdef VMS - {(char_u *)"MMS", (char_u *)0L} -@@ -1663,100 +1674,103 @@ static struct vimoption - # endif - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"matchpairs", "mps", P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP, - (char_u *)&p_mps, PV_MPS, -- {(char_u *)"(:),{:},[:]", (char_u *)0L}}, -+ {(char_u *)"(:),{:},[:]", (char_u *)0L} -+ SCRIPTID_INIT}, - {"matchtime", "mat", P_NUM|P_VI_DEF, - (char_u *)&p_mat, PV_NONE, -- {(char_u *)5L, (char_u *)0L}}, -+ {(char_u *)5L, (char_u *)0L} SCRIPTID_INIT}, - {"maxcombine", "mco", P_NUM|P_VI_DEF, - #ifdef FEAT_MBYTE - (char_u *)&p_mco, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)2, (char_u *)0L}}, -+ {(char_u *)2, (char_u *)0L} SCRIPTID_INIT}, - {"maxfuncdepth", "mfd", P_NUM|P_VI_DEF, - #ifdef FEAT_EVAL - (char_u *)&p_mfd, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)100L, (char_u *)0L}}, -+ {(char_u *)100L, (char_u *)0L} SCRIPTID_INIT}, - {"maxmapdepth", "mmd", P_NUM|P_VI_DEF, - (char_u *)&p_mmd, PV_NONE, -- {(char_u *)1000L, (char_u *)0L}}, -+ {(char_u *)1000L, (char_u *)0L} SCRIPTID_INIT}, - {"maxmem", "mm", P_NUM|P_VI_DEF, - (char_u *)&p_mm, PV_NONE, -- {(char_u *)DFLT_MAXMEM, (char_u *)0L}}, -+ {(char_u *)DFLT_MAXMEM, (char_u *)0L} -+ SCRIPTID_INIT}, - {"maxmempattern","mmp", P_NUM|P_VI_DEF, - (char_u *)&p_mmp, PV_NONE, -- {(char_u *)1000L, (char_u *)0L}}, -+ {(char_u *)1000L, (char_u *)0L} SCRIPTID_INIT}, - {"maxmemtot", "mmt", P_NUM|P_VI_DEF, - (char_u *)&p_mmt, PV_NONE, -- {(char_u *)DFLT_MAXMEMTOT, (char_u *)0L}}, -+ {(char_u *)DFLT_MAXMEMTOT, (char_u *)0L} -+ SCRIPTID_INIT}, - {"menuitems", "mis", P_NUM|P_VI_DEF, - #ifdef FEAT_MENU - (char_u *)&p_mis, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)25L, (char_u *)0L}}, -+ {(char_u *)25L, (char_u *)0L} SCRIPTID_INIT}, - {"mesg", NULL, P_BOOL|P_VI_DEF, - (char_u *)NULL, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"mkspellmem", "msm", P_STRING|P_VI_DEF|P_EXPAND|P_SECURE, - #ifdef FEAT_SPELL - (char_u *)&p_msm, PV_NONE, - {(char_u *)"460000,2000,500", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"modeline", "ml", P_BOOL|P_VIM, - (char_u *)&p_ml, PV_ML, -- {(char_u *)FALSE, (char_u *)TRUE}}, -+ {(char_u *)FALSE, (char_u *)TRUE} SCRIPTID_INIT}, - {"modelines", "mls", P_NUM|P_VI_DEF, - (char_u *)&p_mls, PV_NONE, -- {(char_u *)5L, (char_u *)0L}}, -+ {(char_u *)5L, (char_u *)0L} SCRIPTID_INIT}, - {"modifiable", "ma", P_BOOL|P_VI_DEF|P_NOGLOB, - (char_u *)&p_ma, PV_MA, -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"modified", "mod", P_BOOL|P_NO_MKRC|P_VI_DEF|P_RSTAT, - (char_u *)&p_mod, PV_MOD, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"more", NULL, P_BOOL|P_VIM, - (char_u *)&p_more, PV_NONE, -- {(char_u *)FALSE, (char_u *)TRUE}}, -+ {(char_u *)FALSE, (char_u *)TRUE} SCRIPTID_INIT}, - {"mouse", NULL, P_STRING|P_VI_DEF|P_FLAGLIST, - (char_u *)&p_mouse, PV_NONE, - { - #if defined(MSDOS) || defined(WIN3264) - (char_u *)"a", - #else - (char_u *)"", - #endif -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"mousefocus", "mousef", P_BOOL|P_VI_DEF, - #ifdef FEAT_GUI - (char_u *)&p_mousef, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"mousehide", "mh", P_BOOL|P_VI_DEF, - #ifdef FEAT_GUI - (char_u *)&p_mh, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"mousemodel", "mousem", P_STRING|P_VI_DEF, - (char_u *)&p_mousem, PV_NONE, - { - #if defined(MSDOS) || defined(MSWIN) - (char_u *)"popup", -@@ -1765,103 +1779,104 @@ static struct vimoption - (char_u *)"popup_setpos", - # else - (char_u *)"extend", - # endif - #endif -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"mouseshape", "mouses", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_MOUSESHAPE - (char_u *)&p_mouseshape, PV_NONE, - {(char_u *)"i-r:beam,s:updown,sd:udsizing,vs:leftright,vd:lrsizing,m:no,ml:up-arrow,v:rightup-arrow", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"mousetime", "mouset", P_NUM|P_VI_DEF, - (char_u *)&p_mouset, PV_NONE, -- {(char_u *)500L, (char_u *)0L}}, -+ {(char_u *)500L, (char_u *)0L} SCRIPTID_INIT}, - {"mzquantum", "mzq", P_NUM, - #ifdef FEAT_MZSCHEME - (char_u *)&p_mzq, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)100L, (char_u *)100L}}, -+ {(char_u *)100L, (char_u *)100L} SCRIPTID_INIT}, - {"novice", NULL, P_BOOL|P_VI_DEF, - (char_u *)NULL, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"nrformats", "nf", P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP, - (char_u *)&p_nf, PV_NF, -- {(char_u *)"octal,hex", (char_u *)0L}}, -+ {(char_u *)"octal,hex", (char_u *)0L} -+ SCRIPTID_INIT}, - {"number", "nu", P_BOOL|P_VI_DEF|P_RWIN, - (char_u *)VAR_WIN, PV_NU, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"numberwidth", "nuw", P_NUM|P_RWIN|P_VIM, - #ifdef FEAT_LINEBREAK - (char_u *)VAR_WIN, PV_NUW, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)8L, (char_u *)4L}}, -+ {(char_u *)8L, (char_u *)4L} SCRIPTID_INIT}, - {"omnifunc", "ofu", P_STRING|P_ALLOCED|P_VI_DEF|P_SECURE, - #ifdef FEAT_COMPL_FUNC - (char_u *)&p_ofu, PV_OFU, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"open", NULL, P_BOOL|P_VI_DEF, - (char_u *)NULL, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"opendevice", "odev", P_BOOL|P_VI_DEF, - #if defined(MSDOS) || defined(MSWIN) || defined(OS2) - (char_u *)&p_odev, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif - {(char_u *)FALSE, (char_u *)FALSE} -- }, -+ SCRIPTID_INIT}, - {"operatorfunc", "opfunc", P_STRING|P_VI_DEF|P_SECURE, - (char_u *)&p_opfunc, PV_NONE, -- {(char_u *)"", (char_u *)0L} }, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"optimize", "opt", P_BOOL|P_VI_DEF, - (char_u *)NULL, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"osfiletype", "oft", P_STRING|P_ALLOCED|P_VI_DEF, - #ifdef FEAT_OSFILETYPE - (char_u *)&p_oft, PV_OFT, - {(char_u *)DFLT_OFT, (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"paragraphs", "para", P_STRING|P_VI_DEF, - (char_u *)&p_para, PV_NONE, - {(char_u *)"IPLPPPQPP TPHPLIPpLpItpplpipbp", -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"paste", NULL, P_BOOL|P_VI_DEF|P_PRI_MKRC, - (char_u *)&p_paste, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"pastetoggle", "pt", P_STRING|P_VI_DEF, - (char_u *)&p_pt, PV_NONE, -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"patchexpr", "pex", P_STRING|P_VI_DEF|P_SECURE, - #if defined(FEAT_DIFF) && defined(FEAT_EVAL) - (char_u *)&p_pex, PV_NONE, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"patchmode", "pm", P_STRING|P_VI_DEF|P_NFNAME, - (char_u *)&p_pm, PV_NONE, -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"path", "pa", P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP, - (char_u *)&p_path, PV_PATH, - { - #if defined AMIGA || defined MSDOS || defined MSWIN - (char_u *)".,,", -@@ -1870,55 +1885,55 @@ static struct vimoption - (char_u *)".,/emx/include,,", - # else /* Unix, probably */ - (char_u *)".,/usr/include,,", - # endif - #endif -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"preserveindent", "pi", P_BOOL|P_VI_DEF|P_VIM, - (char_u *)&p_pi, PV_PI, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"previewheight", "pvh", P_NUM|P_VI_DEF, - #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX) - (char_u *)&p_pvh, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)12L, (char_u *)0L}}, -+ {(char_u *)12L, (char_u *)0L} SCRIPTID_INIT}, - {"previewwindow", "pvw", P_BOOL|P_VI_DEF|P_RSTAT|P_NOGLOB, - #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX) - (char_u *)VAR_WIN, PV_PVW, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"printdevice", "pdev", P_STRING|P_VI_DEF|P_SECURE, - #ifdef FEAT_PRINTER - (char_u *)&p_pdev, PV_NONE, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"printencoding", "penc", P_STRING|P_VI_DEF, - #ifdef FEAT_POSTSCRIPT - (char_u *)&p_penc, PV_NONE, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"printexpr", "pexpr", P_STRING|P_VI_DEF, - #ifdef FEAT_POSTSCRIPT - (char_u *)&p_pexpr, PV_NONE, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"printfont", "pfn", P_STRING|P_VI_DEF, - #ifdef FEAT_PRINTER - (char_u *)&p_pfn, PV_NONE, - { - # ifdef MSWIN -@@ -1929,187 +1944,190 @@ static struct vimoption - (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"printheader", "pheader", P_STRING|P_VI_DEF|P_GETTEXT, - #ifdef FEAT_PRINTER - (char_u *)&p_header, PV_NONE, - {(char_u *)N_("%<%f%h%m%=Page %N"), (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"printmbcharset", "pmbcs", P_STRING|P_VI_DEF, - #if defined(FEAT_POSTSCRIPT) && defined(FEAT_MBYTE) - (char_u *)&p_pmcs, PV_NONE, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"printmbfont", "pmbfn", P_STRING|P_VI_DEF, - #if defined(FEAT_POSTSCRIPT) && defined(FEAT_MBYTE) - (char_u *)&p_pmfn, PV_NONE, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"printoptions", "popt", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_PRINTER - (char_u *)&p_popt, PV_NONE, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"prompt", NULL, P_BOOL|P_VI_DEF, - (char_u *)&p_prompt, PV_NONE, -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"pumheight", "ph", P_NUM|P_VI_DEF, - #ifdef FEAT_INS_EXPAND - (char_u *)&p_ph, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"quoteescape", "qe", P_STRING|P_ALLOCED|P_VI_DEF, - #ifdef FEAT_TEXTOBJ - (char_u *)&p_qe, PV_QE, - {(char_u *)"\\", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"readonly", "ro", P_BOOL|P_VI_DEF|P_RSTAT|P_NOGLOB, - (char_u *)&p_ro, PV_RO, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"redraw", NULL, P_BOOL|P_VI_DEF, - (char_u *)NULL, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"redrawtime", "rdt", P_NUM|P_VI_DEF, - #ifdef FEAT_RELTIME - (char_u *)&p_rdt, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)2000L, (char_u *)0L}}, -+ {(char_u *)2000L, (char_u *)0L} SCRIPTID_INIT}, - {"remap", NULL, P_BOOL|P_VI_DEF, - (char_u *)&p_remap, PV_NONE, -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"report", NULL, P_NUM|P_VI_DEF, - (char_u *)&p_report, PV_NONE, -- {(char_u *)2L, (char_u *)0L}}, -+ {(char_u *)2L, (char_u *)0L} SCRIPTID_INIT}, - {"restorescreen", "rs", P_BOOL|P_VI_DEF, - #ifdef WIN3264 - (char_u *)&p_rs, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"revins", "ri", P_BOOL|P_VI_DEF|P_VIM, - #ifdef FEAT_RIGHTLEFT - (char_u *)&p_ri, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"rightleft", "rl", P_BOOL|P_VI_DEF|P_RWIN, - #ifdef FEAT_RIGHTLEFT - (char_u *)VAR_WIN, PV_RL, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"rightleftcmd", "rlc", P_STRING|P_ALLOCED|P_VI_DEF|P_RWIN, - #ifdef FEAT_RIGHTLEFT - (char_u *)VAR_WIN, PV_RLC, - {(char_u *)"search", (char_u *)NULL} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"ruler", "ru", P_BOOL|P_VI_DEF|P_VIM|P_RSTAT, - #ifdef FEAT_CMDL_INFO - (char_u *)&p_ru, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"rulerformat", "ruf", P_STRING|P_VI_DEF|P_ALLOCED|P_RSTAT, - #ifdef FEAT_STL_OPT - (char_u *)&p_ruf, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"runtimepath", "rtp", P_STRING|P_VI_DEF|P_EXPAND|P_COMMA|P_NODUP|P_SECURE, - (char_u *)&p_rtp, PV_NONE, -- {(char_u *)DFLT_RUNTIMEPATH, (char_u *)0L}}, -+ {(char_u *)DFLT_RUNTIMEPATH, (char_u *)0L} -+ SCRIPTID_INIT}, - {"scroll", "scr", P_NUM|P_NO_MKRC|P_VI_DEF, - (char_u *)VAR_WIN, PV_SCROLL, -- {(char_u *)12L, (char_u *)0L}}, -+ {(char_u *)12L, (char_u *)0L} SCRIPTID_INIT}, - {"scrollbind", "scb", P_BOOL|P_VI_DEF, - #ifdef FEAT_SCROLLBIND - (char_u *)VAR_WIN, PV_SCBIND, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"scrolljump", "sj", P_NUM|P_VI_DEF|P_VIM, - (char_u *)&p_sj, PV_NONE, -- {(char_u *)1L, (char_u *)0L}}, -+ {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT}, - {"scrolloff", "so", P_NUM|P_VI_DEF|P_VIM|P_RALL, - (char_u *)&p_so, PV_NONE, -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"scrollopt", "sbo", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_SCROLLBIND - (char_u *)&p_sbo, PV_NONE, - {(char_u *)"ver,jump", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"sections", "sect", P_STRING|P_VI_DEF, - (char_u *)&p_sections, PV_NONE, -- {(char_u *)"SHNHH HUnhsh", (char_u *)0L}}, -+ {(char_u *)"SHNHH HUnhsh", (char_u *)0L} -+ SCRIPTID_INIT}, - {"secure", NULL, P_BOOL|P_VI_DEF|P_SECURE, - (char_u *)&p_secure, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"selection", "sel", P_STRING|P_VI_DEF, - #ifdef FEAT_VISUAL - (char_u *)&p_sel, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)"inclusive", (char_u *)0L}}, -+ {(char_u *)"inclusive", (char_u *)0L} -+ SCRIPTID_INIT}, - {"selectmode", "slm", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_VISUAL - (char_u *)&p_slm, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"sessionoptions", "ssop", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_SESSION - (char_u *)&p_ssop, PV_NONE, - {(char_u *)"blank,buffers,curdir,folds,help,options,tabpages,winsize", - (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"shell", "sh", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE, - (char_u *)&p_sh, PV_NONE, - { - #ifdef VMS - (char_u *)"-", -@@ -2134,11 +2152,11 @@ static struct vimoption - # endif - # endif - # endif - # endif - #endif /* VMS */ -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"shellcmdflag","shcf", P_STRING|P_VI_DEF|P_SECURE, - (char_u *)&p_shcf, PV_NONE, - { - #if defined(MSDOS) || defined(MSWIN) - (char_u *)"/c", -@@ -2147,11 +2165,11 @@ static struct vimoption - (char_u *)"/c", - # else - (char_u *)"-c", - # endif - #endif -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"shellpipe", "sp", P_STRING|P_VI_DEF|P_SECURE, - #ifdef FEAT_QUICKFIX - (char_u *)&p_sp, PV_NONE, - { - #if defined(UNIX) || defined(OS2) -@@ -2166,66 +2184,67 @@ static struct vimoption - (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"shellquote", "shq", P_STRING|P_VI_DEF|P_SECURE, - (char_u *)&p_shq, PV_NONE, -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"shellredir", "srr", P_STRING|P_VI_DEF|P_SECURE, - (char_u *)&p_srr, PV_NONE, -- {(char_u *)">", (char_u *)0L}}, -+ {(char_u *)">", (char_u *)0L} SCRIPTID_INIT}, - {"shellslash", "ssl", P_BOOL|P_VI_DEF, - #ifdef BACKSLASH_IN_FILENAME - (char_u *)&p_ssl, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"shelltemp", "stmp", P_BOOL, - (char_u *)&p_stmp, PV_NONE, -- {(char_u *)FALSE, (char_u *)TRUE}}, -+ {(char_u *)FALSE, (char_u *)TRUE} SCRIPTID_INIT}, - {"shelltype", "st", P_NUM|P_VI_DEF, - #ifdef AMIGA - (char_u *)&p_st, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"shellxquote", "sxq", P_STRING|P_VI_DEF|P_SECURE, - (char_u *)&p_sxq, PV_NONE, - { - #if defined(UNIX) && defined(USE_SYSTEM) && !defined(__EMX__) - (char_u *)"\"", - #else - (char_u *)"", - #endif -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"shiftround", "sr", P_BOOL|P_VI_DEF|P_VIM, - (char_u *)&p_sr, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"shiftwidth", "sw", P_NUM|P_VI_DEF, - (char_u *)&p_sw, PV_SW, -- {(char_u *)8L, (char_u *)0L}}, -+ {(char_u *)8L, (char_u *)0L} SCRIPTID_INIT}, - {"shortmess", "shm", P_STRING|P_VIM|P_FLAGLIST, - (char_u *)&p_shm, PV_NONE, -- {(char_u *)"", (char_u *)"filnxtToO"}}, -+ {(char_u *)"", (char_u *)"filnxtToO"} -+ SCRIPTID_INIT}, - {"shortname", "sn", P_BOOL|P_VI_DEF, - #ifdef SHORT_FNAME - (char_u *)NULL, PV_NONE, - #else - (char_u *)&p_sn, PV_SN, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"showbreak", "sbr", P_STRING|P_VI_DEF|P_RALL, - #ifdef FEAT_LINEBREAK - (char_u *)&p_sbr, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"showcmd", "sc", P_BOOL|P_VIM, - #ifdef FEAT_CMDL_INFO - (char_u *)&p_sc, PV_NONE, - #else - (char_u *)NULL, PV_NONE, -@@ -2234,529 +2253,532 @@ static struct vimoption - #ifdef UNIX - (char_u *)FALSE - #else - (char_u *)TRUE - #endif -- }}, -+ } SCRIPTID_INIT}, - {"showfulltag", "sft", P_BOOL|P_VI_DEF, - (char_u *)&p_sft, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"showmatch", "sm", P_BOOL|P_VI_DEF, - (char_u *)&p_sm, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"showmode", "smd", P_BOOL|P_VIM, - (char_u *)&p_smd, PV_NONE, -- {(char_u *)FALSE, (char_u *)TRUE}}, -+ {(char_u *)FALSE, (char_u *)TRUE} SCRIPTID_INIT}, - {"showtabline", "stal", P_NUM|P_VI_DEF|P_RALL, - #ifdef FEAT_WINDOWS - (char_u *)&p_stal, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)1L, (char_u *)0L}}, -+ {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT}, - {"sidescroll", "ss", P_NUM|P_VI_DEF, - (char_u *)&p_ss, PV_NONE, -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"sidescrolloff", "siso", P_NUM|P_VI_DEF|P_VIM|P_RBUF, - (char_u *)&p_siso, PV_NONE, -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"slowopen", "slow", P_BOOL|P_VI_DEF, - (char_u *)NULL, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"smartcase", "scs", P_BOOL|P_VI_DEF|P_VIM, - (char_u *)&p_scs, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"smartindent", "si", P_BOOL|P_VI_DEF|P_VIM, - #ifdef FEAT_SMARTINDENT - (char_u *)&p_si, PV_SI, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"smarttab", "sta", P_BOOL|P_VI_DEF|P_VIM, - (char_u *)&p_sta, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"softtabstop", "sts", P_NUM|P_VI_DEF|P_VIM, - (char_u *)&p_sts, PV_STS, -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"sourceany", NULL, P_BOOL|P_VI_DEF, - (char_u *)NULL, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"spell", NULL, P_BOOL|P_VI_DEF|P_RWIN, - #ifdef FEAT_SPELL - (char_u *)VAR_WIN, PV_SPELL, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"spellcapcheck", "spc", P_STRING|P_ALLOCED|P_VI_DEF|P_RBUF, - #ifdef FEAT_SPELL - (char_u *)&p_spc, PV_SPC, - {(char_u *)"[.?!]\\_[\\])'\" ]\\+", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"spellfile", "spf", P_STRING|P_EXPAND|P_ALLOCED|P_VI_DEF|P_SECURE|P_COMMA, - #ifdef FEAT_SPELL - (char_u *)&p_spf, PV_SPF, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"spelllang", "spl", P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_RBUF|P_EXPAND, - #ifdef FEAT_SPELL - (char_u *)&p_spl, PV_SPL, - {(char_u *)"en", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"spellsuggest", "sps", P_STRING|P_VI_DEF|P_EXPAND|P_SECURE|P_COMMA, - #ifdef FEAT_SPELL - (char_u *)&p_sps, PV_NONE, - {(char_u *)"best", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"splitbelow", "sb", P_BOOL|P_VI_DEF, - #ifdef FEAT_WINDOWS - (char_u *)&p_sb, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"splitright", "spr", P_BOOL|P_VI_DEF, - #ifdef FEAT_VERTSPLIT - (char_u *)&p_spr, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"startofline", "sol", P_BOOL|P_VI_DEF|P_VIM, - (char_u *)&p_sol, PV_NONE, -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"statusline" ,"stl", P_STRING|P_VI_DEF|P_ALLOCED|P_RSTAT, - #ifdef FEAT_STL_OPT - (char_u *)&p_stl, PV_STL, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"suffixes", "su", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - (char_u *)&p_su, PV_NONE, - {(char_u *)".bak,~,.o,.h,.info,.swp,.obj", -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"suffixesadd", "sua", P_STRING|P_VI_DEF|P_ALLOCED|P_COMMA|P_NODUP, - #ifdef FEAT_SEARCHPATH - (char_u *)&p_sua, PV_SUA, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"swapfile", "swf", P_BOOL|P_VI_DEF|P_RSTAT, - (char_u *)&p_swf, PV_SWF, -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"swapsync", "sws", P_STRING|P_VI_DEF, - (char_u *)&p_sws, PV_NONE, -- {(char_u *)"fsync", (char_u *)0L}}, -+ {(char_u *)"fsync", (char_u *)0L} SCRIPTID_INIT}, - {"switchbuf", "swb", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - (char_u *)&p_swb, PV_NONE, -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"synmaxcol", "smc", P_NUM|P_VI_DEF|P_RBUF, - #ifdef FEAT_SYN_HL - (char_u *)&p_smc, PV_SMC, - {(char_u *)3000L, (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"syntax", "syn", P_STRING|P_ALLOCED|P_VI_DEF|P_NOGLOB|P_NFNAME, - #ifdef FEAT_SYN_HL - (char_u *)&p_syn, PV_SYN, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"tabline", "tal", P_STRING|P_VI_DEF|P_RALL, - #ifdef FEAT_STL_OPT - (char_u *)&p_tal, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"tabpagemax", "tpm", P_NUM|P_VI_DEF, - #ifdef FEAT_WINDOWS - (char_u *)&p_tpm, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)10L, (char_u *)0L}}, -+ {(char_u *)10L, (char_u *)0L} SCRIPTID_INIT}, - {"tabstop", "ts", P_NUM|P_VI_DEF|P_RBUF, - (char_u *)&p_ts, PV_TS, -- {(char_u *)8L, (char_u *)0L}}, -+ {(char_u *)8L, (char_u *)0L} SCRIPTID_INIT}, - {"tagbsearch", "tbs", P_BOOL|P_VI_DEF, - (char_u *)&p_tbs, PV_NONE, - #ifdef VMS /* binary searching doesn't appear to work on VMS */ - {(char_u *)0L, (char_u *)0L} - #else - {(char_u *)TRUE, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"taglength", "tl", P_NUM|P_VI_DEF, - (char_u *)&p_tl, PV_NONE, -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"tagrelative", "tr", P_BOOL|P_VIM, - (char_u *)&p_tr, PV_NONE, -- {(char_u *)FALSE, (char_u *)TRUE}}, -+ {(char_u *)FALSE, (char_u *)TRUE} SCRIPTID_INIT}, - {"tags", "tag", P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP, - (char_u *)&p_tags, PV_TAGS, - { - #if defined(FEAT_EMACS_TAGS) && !defined(CASE_INSENSITIVE_FILENAME) - (char_u *)"./tags,./TAGS,tags,TAGS", - #else - (char_u *)"./tags,tags", - #endif -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"tagstack", "tgst", P_BOOL|P_VI_DEF, - (char_u *)&p_tgst, PV_NONE, -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"term", NULL, P_STRING|P_EXPAND|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RALL, - (char_u *)&T_NAME, PV_NONE, -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"termbidi", "tbidi", P_BOOL|P_VI_DEF, - #ifdef FEAT_ARABIC - (char_u *)&p_tbidi, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"termencoding", "tenc", P_STRING|P_VI_DEF|P_RCLR, - #ifdef FEAT_MBYTE - (char_u *)&p_tenc, PV_NONE, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"terse", NULL, P_BOOL|P_VI_DEF, - (char_u *)&p_terse, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"textauto", "ta", P_BOOL|P_VIM, - (char_u *)&p_ta, PV_NONE, -- {(char_u *)DFLT_TEXTAUTO, (char_u *)TRUE}}, -+ {(char_u *)DFLT_TEXTAUTO, (char_u *)TRUE} -+ SCRIPTID_INIT}, - {"textmode", "tx", P_BOOL|P_VI_DEF|P_NO_MKRC, - (char_u *)&p_tx, PV_TX, - { - #ifdef USE_CRNL - (char_u *)TRUE, - #else - (char_u *)FALSE, - #endif -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"textwidth", "tw", P_NUM|P_VI_DEF|P_VIM, - (char_u *)&p_tw, PV_TW, -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"thesaurus", "tsr", P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_INS_EXPAND - (char_u *)&p_tsr, PV_TSR, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"tildeop", "top", P_BOOL|P_VI_DEF|P_VIM, - (char_u *)&p_to, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"timeout", "to", P_BOOL|P_VI_DEF, - (char_u *)&p_timeout, PV_NONE, -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"timeoutlen", "tm", P_NUM|P_VI_DEF, - (char_u *)&p_tm, PV_NONE, -- {(char_u *)1000L, (char_u *)0L}}, -+ {(char_u *)1000L, (char_u *)0L} SCRIPTID_INIT}, - {"title", NULL, P_BOOL|P_VI_DEF, - #ifdef FEAT_TITLE - (char_u *)&p_title, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"titlelen", NULL, P_NUM|P_VI_DEF, - #ifdef FEAT_TITLE - (char_u *)&p_titlelen, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)85L, (char_u *)0L}}, -+ {(char_u *)85L, (char_u *)0L} SCRIPTID_INIT}, - {"titleold", NULL, P_STRING|P_VI_DEF|P_GETTEXT|P_SECURE|P_NO_MKRC, - #ifdef FEAT_TITLE - (char_u *)&p_titleold, PV_NONE, - {(char_u *)N_("Thanks for flying Vim"), - (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"titlestring", NULL, P_STRING|P_VI_DEF, - #ifdef FEAT_TITLE - (char_u *)&p_titlestring, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - #if defined(FEAT_TOOLBAR) && !defined(FEAT_GUI_W32) - {"toolbar", "tb", P_STRING|P_COMMA|P_VI_DEF|P_NODUP, - (char_u *)&p_toolbar, PV_NONE, -- {(char_u *)"icons,tooltips", (char_u *)0L}}, -+ {(char_u *)"icons,tooltips", (char_u *)0L} -+ SCRIPTID_INIT}, - #endif - #if defined(FEAT_TOOLBAR) && defined(FEAT_GUI_GTK) && defined(HAVE_GTK2) - {"toolbariconsize", "tbis", P_STRING|P_VI_DEF, - (char_u *)&p_tbis, PV_NONE, -- {(char_u *)"small", (char_u *)0L}}, -+ {(char_u *)"small", (char_u *)0L} SCRIPTID_INIT}, - #endif - {"ttimeout", NULL, P_BOOL|P_VI_DEF|P_VIM, - (char_u *)&p_ttimeout, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"ttimeoutlen", "ttm", P_NUM|P_VI_DEF, - (char_u *)&p_ttm, PV_NONE, -- {(char_u *)-1L, (char_u *)0L}}, -+ {(char_u *)-1L, (char_u *)0L} SCRIPTID_INIT}, - {"ttybuiltin", "tbi", P_BOOL|P_VI_DEF, - (char_u *)&p_tbi, PV_NONE, -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"ttyfast", "tf", P_BOOL|P_NO_MKRC|P_VI_DEF, - (char_u *)&p_tf, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"ttymouse", "ttym", P_STRING|P_NODEFAULT|P_NO_MKRC|P_VI_DEF, - #if defined(FEAT_MOUSE) && (defined(UNIX) || defined(VMS)) - (char_u *)&p_ttym, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"ttyscroll", "tsl", P_NUM|P_VI_DEF, - (char_u *)&p_ttyscroll, PV_NONE, -- {(char_u *)999L, (char_u *)0L}}, -+ {(char_u *)999L, (char_u *)0L} SCRIPTID_INIT}, - {"ttytype", "tty", P_STRING|P_EXPAND|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RALL, - (char_u *)&T_NAME, PV_NONE, -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"undolevels", "ul", P_NUM|P_VI_DEF, - (char_u *)&p_ul, PV_NONE, - { - #if defined(UNIX) || defined(WIN3264) || defined(OS2) || defined(VMS) - (char_u *)1000L, - #else - (char_u *)100L, - #endif -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"updatecount", "uc", P_NUM|P_VI_DEF, - (char_u *)&p_uc, PV_NONE, -- {(char_u *)200L, (char_u *)0L}}, -+ {(char_u *)200L, (char_u *)0L} SCRIPTID_INIT}, - {"updatetime", "ut", P_NUM|P_VI_DEF, - (char_u *)&p_ut, PV_NONE, -- {(char_u *)4000L, (char_u *)0L}}, -+ {(char_u *)4000L, (char_u *)0L} SCRIPTID_INIT}, - {"verbose", "vbs", P_NUM|P_VI_DEF, - (char_u *)&p_verbose, PV_NONE, -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"verbosefile", "vfile", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE, - (char_u *)&p_vfile, PV_NONE, -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"viewdir", "vdir", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE, - #ifdef FEAT_SESSION - (char_u *)&p_vdir, PV_NONE, - {(char_u *)DFLT_VDIR, (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"viewoptions", "vop", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_SESSION - (char_u *)&p_vop, PV_NONE, - {(char_u *)"folds,options,cursor", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"viminfo", "vi", P_STRING|P_COMMA|P_NODUP|P_SECURE, - #ifdef FEAT_VIMINFO - (char_u *)&p_viminfo, PV_NONE, - #if defined(MSDOS) || defined(MSWIN) || defined(OS2) -- {(char_u *)"", (char_u *)"'20,<50,s10,h,rA:,rB:"} -+ {(char_u *)"", (char_u *)"'100,<50,s10,h,rA:,rB:"} - #else - # ifdef AMIGA - {(char_u *)"", -- (char_u *)"'20,<50,s10,h,rdf0:,rdf1:,rdf2:"} -+ (char_u *)"'100,<50,s10,h,rdf0:,rdf1:,rdf2:"} - # else -- {(char_u *)"", (char_u *)"'20,<50,s10,h"} -+ {(char_u *)"", (char_u *)"'100,<50,s10,h"} - # endif - #endif - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"virtualedit", "ve", P_STRING|P_COMMA|P_NODUP|P_VI_DEF|P_VIM, - #ifdef FEAT_VIRTUALEDIT - (char_u *)&p_ve, PV_NONE, - {(char_u *)"", (char_u *)""} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)0L, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"visualbell", "vb", P_BOOL|P_VI_DEF, - (char_u *)&p_vb, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"w300", NULL, P_NUM|P_VI_DEF, - (char_u *)NULL, PV_NONE, -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"w1200", NULL, P_NUM|P_VI_DEF, - (char_u *)NULL, PV_NONE, -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"w9600", NULL, P_NUM|P_VI_DEF, - (char_u *)NULL, PV_NONE, -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"warn", NULL, P_BOOL|P_VI_DEF, - (char_u *)&p_warn, PV_NONE, -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"weirdinvert", "wiv", P_BOOL|P_VI_DEF|P_RCLR, - (char_u *)&p_wiv, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"whichwrap", "ww", P_STRING|P_VIM|P_COMMA|P_FLAGLIST, - (char_u *)&p_ww, PV_NONE, -- {(char_u *)"", (char_u *)"b,s"}}, -+ {(char_u *)"", (char_u *)"b,s"} SCRIPTID_INIT}, - {"wildchar", "wc", P_NUM|P_VIM, - (char_u *)&p_wc, PV_NONE, -- {(char_u *)(long)Ctrl_E, (char_u *)(long)TAB}}, -+ {(char_u *)(long)Ctrl_E, (char_u *)(long)TAB} -+ SCRIPTID_INIT}, - {"wildcharm", "wcm", P_NUM|P_VI_DEF, - (char_u *)&p_wcm, PV_NONE, -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"wildignore", "wig", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - #ifdef FEAT_WILDIGN - (char_u *)&p_wig, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - {"wildmenu", "wmnu", P_BOOL|P_VI_DEF, - #ifdef FEAT_WILDMENU - (char_u *)&p_wmnu, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"wildmode", "wim", P_STRING|P_VI_DEF|P_COMMA|P_NODUP, - (char_u *)&p_wim, PV_NONE, -- {(char_u *)"full", (char_u *)0L}}, -+ {(char_u *)"full", (char_u *)0L} SCRIPTID_INIT}, - {"wildoptions", "wop", P_STRING|P_VI_DEF, - #ifdef FEAT_CMDL_COMPL - (char_u *)&p_wop, PV_NONE, - {(char_u *)"", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"winaltkeys", "wak", P_STRING|P_VI_DEF, - #ifdef FEAT_WAK - (char_u *)&p_wak, PV_NONE, - {(char_u *)"menu", (char_u *)0L} - #else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, (char_u *)0L} - #endif -- }, -+ SCRIPTID_INIT}, - {"window", "wi", P_NUM|P_VI_DEF, - (char_u *)&p_window, PV_NONE, -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"winheight", "wh", P_NUM|P_VI_DEF, - #ifdef FEAT_WINDOWS - (char_u *)&p_wh, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)1L, (char_u *)0L}}, -+ {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT}, - {"winfixheight", "wfh", P_BOOL|P_VI_DEF|P_RSTAT, - #ifdef FEAT_WINDOWS - (char_u *)VAR_WIN, PV_WFH, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"winfixwidth", "wfw", P_BOOL|P_VI_DEF|P_RSTAT, - #ifdef FEAT_VERTSPLIT - (char_u *)VAR_WIN, PV_WFW, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"winminheight", "wmh", P_NUM|P_VI_DEF, - #ifdef FEAT_WINDOWS - (char_u *)&p_wmh, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)1L, (char_u *)0L}}, -+ {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT}, - {"winminwidth", "wmw", P_NUM|P_VI_DEF, - #ifdef FEAT_VERTSPLIT - (char_u *)&p_wmw, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)1L, (char_u *)0L}}, -+ {(char_u *)1L, (char_u *)0L} SCRIPTID_INIT}, - {"winwidth", "wiw", P_NUM|P_VI_DEF, - #ifdef FEAT_VERTSPLIT - (char_u *)&p_wiw, PV_NONE, - #else - (char_u *)NULL, PV_NONE, - #endif -- {(char_u *)20L, (char_u *)0L}}, -+ {(char_u *)20L, (char_u *)0L} SCRIPTID_INIT}, - {"wrap", NULL, P_BOOL|P_VI_DEF|P_RWIN, - (char_u *)VAR_WIN, PV_WRAP, -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"wrapmargin", "wm", P_NUM|P_VI_DEF, - (char_u *)&p_wm, PV_WM, -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - {"wrapscan", "ws", P_BOOL|P_VI_DEF, - (char_u *)&p_ws, PV_NONE, -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"write", NULL, P_BOOL|P_VI_DEF, - (char_u *)&p_write, PV_NONE, -- {(char_u *)TRUE, (char_u *)0L}}, -+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT}, - {"writeany", "wa", P_BOOL|P_VI_DEF, - (char_u *)&p_wa, PV_NONE, -- {(char_u *)FALSE, (char_u *)0L}}, -+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, - {"writebackup", "wb", P_BOOL|P_VI_DEF|P_VIM, - (char_u *)&p_wb, PV_NONE, - { - #ifdef FEAT_WRITEBACKUP - (char_u *)TRUE, - #else - (char_u *)FALSE, - #endif -- (char_u *)0L}}, -+ (char_u *)0L} SCRIPTID_INIT}, - {"writedelay", "wd", P_NUM|P_VI_DEF, - (char_u *)&p_wd, PV_NONE, -- {(char_u *)0L, (char_u *)0L}}, -+ {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, - - /* terminal output codes */ - #define p_term(sss, vvv) {sss, NULL, P_STRING|P_VI_DEF|P_RALL|P_SECURE, \ - (char_u *)&vvv, PV_NONE, \ -- {(char_u *)"", (char_u *)0L}}, -+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT}, - - p_term("t_AB", T_CAB) - p_term("t_AF", T_CAF) - p_term("t_AL", T_CAL) - p_term("t_al", T_AL) -@@ -2813,11 +2835,12 @@ static struct vimoption - p_term("t_ZH", T_CZH) - p_term("t_ZR", T_CZR) - - /* terminal key codes are not in here */ - -- {NULL, NULL, 0, NULL, PV_NONE, {NULL, NULL}} /* end marker */ -+ /* end marker */ -+ {NULL, NULL, 0, NULL, PV_NONE, {NULL, NULL} SCRIPTID_INIT} - }; - - #define PARAM_COUNT (sizeof(options) / sizeof(struct vimoption)) - - #ifdef FEAT_MBYTE -@@ -3982,11 +4005,11 @@ do_set(arg, opt_flags) - arg += 7; - } - else - { - prefix = 1; -- if (STRNCMP(arg, "no", 2) == 0) -+ if (STRNCMP(arg, "no", 2) == 0 && STRNCMP(arg, "novice", 6) != 0) - { - prefix = 0; - arg += 2; - } - else if (STRNCMP(arg, "inv", 3) == 0) -@@ -4117,15 +4140,27 @@ do_set(arg, opt_flags) - /* Skip all options that are window-local (used for :vimgrep). */ - if ((opt_flags & OPT_NOWIN) && opt_idx >= 0 - && options[opt_idx].var == VAR_WIN) - goto skip; - -- /* Disallow changing some options from modelines */ -- if ((opt_flags & OPT_MODELINE) && (flags & P_SECURE)) -+ /* Disallow changing some options from modelines. */ -+ if (opt_flags & OPT_MODELINE) - { -- errmsg = (char_u *)_("E520: Not allowed in a modeline"); -- goto skip; -+ if (flags & P_SECURE) -+ { -+ errmsg = (char_u *)_("E520: Not allowed in a modeline"); -+ goto skip; -+ } -+#ifdef FEAT_DIFF -+ /* In diff mode some options are overruled. This avoids that -+ * 'foldmethod' becomes "marker" instead of "diff" and that -+ * "wrap" gets set. */ -+ if (curwin->w_p_diff -+ && (options[opt_idx].indir == PV_FDM -+ || options[opt_idx].indir == PV_WRAP)) -+ goto skip; -+#endif - } - - #ifdef HAVE_SANDBOX - /* Disallow changing some options in the sandbox */ - if (sandbox != 0 && (flags & P_SECURE)) -@@ -5266,25 +5301,39 @@ insecure_flag(opt_idx, opt_flags) - /* Nothing special, return global flags field. */ - return &options[opt_idx].flags; - } - #endif - -+#ifdef FEAT_TITLE -+static void redraw_titles __ARGS((void)); -+ -+/* -+ * Redraw the window title and/or tab page text later. -+ */ -+static void redraw_titles() -+{ -+ need_maketitle = TRUE; -+# ifdef FEAT_WINDOWS -+ redraw_tabline = TRUE; -+# endif -+} -+#endif -+ - /* - * Set a string option to a new value (without checking the effect). - * The string is copied into allocated memory. - * if ("opt_idx" == -1) "name" is used, otherwise "opt_idx" is used. - * When "set_sid" is zero set the scriptID to current_SID. When "set_sid" is - * SID_NONE don't set the scriptID. Otherwise set the scriptID to "set_sid". - */ --/*ARGSUSED*/ - void - set_string_option_direct(name, opt_idx, val, opt_flags, set_sid) - char_u *name; - int opt_idx; - char_u *val; - int opt_flags; /* OPT_FREE, OPT_LOCAL and/or OPT_GLOBAL */ -- int set_sid; -+ int set_sid UNUSED; - { - char_u *s; - char_u **varp; - int both = (opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0; - int idx = opt_idx; -@@ -5405,10 +5454,14 @@ did_set_string_option(opt_idx, varp, new - char_u *errmsg = NULL; - char_u *s, *p; - int did_chartab = FALSE; - char_u **gvarp; - long_u free_oldval = (options[opt_idx].flags & P_ALLOCED); -+#ifdef FEAT_GUI -+ /* set when changing an option that only requires a redraw in the GUI */ -+ int redraw_gui_only = FALSE; -+#endif - - /* Get the global option to compare with, otherwise we would have to check - * two values for all local options. */ - gvarp = (char_u **)get_varp_scope(&(options[opt_idx]), OPT_GLOBAL); - -@@ -5666,11 +5719,11 @@ did_set_string_option(opt_idx, varp, new - errmsg = e_invarg; - else - { - # ifdef FEAT_TITLE - /* May show a "+" in the title now. */ -- need_maketitle = TRUE; -+ redraw_titles(); - # endif - /* Add 'fileencoding' to the swap file. */ - ml_setflags(curbuf); - } - } -@@ -5685,11 +5738,11 @@ did_set_string_option(opt_idx, varp, new - } - if (varp == &p_enc) - { - errmsg = mb_init(); - # ifdef FEAT_TITLE -- need_maketitle = TRUE; -+ redraw_titles(); - # endif - } - } - - # if defined(FEAT_GUI_GTK) && defined(HAVE_GTK2) -@@ -5764,18 +5817,32 @@ did_set_string_option(opt_idx, varp, new - else if (varp == &curbuf->b_p_keymap) - { - /* load or unload key mapping tables */ - errmsg = keymap_init(); - -- /* When successfully installed a new keymap switch on using it. */ -- if (*curbuf->b_p_keymap != NUL && errmsg == NULL) -+ if (errmsg == NULL) - { -- curbuf->b_p_iminsert = B_IMODE_LMAP; -- if (curbuf->b_p_imsearch != B_IMODE_USE_INSERT) -- curbuf->b_p_imsearch = B_IMODE_LMAP; -- set_iminsert_global(); -- set_imsearch_global(); -+ if (*curbuf->b_p_keymap != NUL) -+ { -+ /* Installed a new keymap, switch on using it. */ -+ curbuf->b_p_iminsert = B_IMODE_LMAP; -+ if (curbuf->b_p_imsearch != B_IMODE_USE_INSERT) -+ curbuf->b_p_imsearch = B_IMODE_LMAP; -+ } -+ else -+ { -+ /* Cleared the keymap, may reset 'iminsert' and 'imsearch'. */ -+ if (curbuf->b_p_iminsert == B_IMODE_LMAP) -+ curbuf->b_p_iminsert = B_IMODE_NONE; -+ if (curbuf->b_p_imsearch == B_IMODE_LMAP) -+ curbuf->b_p_imsearch = B_IMODE_USE_INSERT; -+ } -+ if ((opt_flags & OPT_LOCAL) == 0) -+ { -+ set_iminsert_global(); -+ set_imsearch_global(); -+ } - # ifdef FEAT_WINDOWS - status_redraw_curbuf(); - # endif - } - } -@@ -5794,14 +5861,18 @@ did_set_string_option(opt_idx, varp, new - if (get_fileformat(curbuf) == EOL_DOS) - curbuf->b_p_tx = TRUE; - else - curbuf->b_p_tx = FALSE; - #ifdef FEAT_TITLE -- need_maketitle = TRUE; -+ redraw_titles(); - #endif - /* update flag in swap file */ - ml_setflags(curbuf); -+ /* Redraw needed when switching to/from "mac": a CR in the text -+ * will be displayed differently. */ -+ if (get_fileformat(curbuf) == EOL_MAC || *oldval == 'm') -+ redraw_curbuf_later(NOT_VALID); - } - } - - /* 'fileformats' */ - else if (varp == &p_ffs) -@@ -5975,19 +6046,27 @@ did_set_string_option(opt_idx, varp, new - else if (istermoption(&options[opt_idx]) && full_screen) - { - /* ":set t_Co=0" and ":set t_Co=1" do ":set t_Co=" */ - if (varp == &T_CCO) - { -- t_colors = atoi((char *)T_CCO); -- if (t_colors <= 1) -+ int colors = atoi((char *)T_CCO); -+ -+ /* Only reinitialize colors if t_Co value has really changed to -+ * avoid expensive reload of colorscheme if t_Co is set to the -+ * same value multiple times. */ -+ if (colors != t_colors) - { -- if (new_value_alloced) -- vim_free(T_CCO); -- T_CCO = empty_option; -+ t_colors = colors; -+ if (t_colors <= 1) -+ { -+ if (new_value_alloced) -+ vim_free(T_CCO); -+ T_CCO = empty_option; -+ } -+ /* We now have a different color setup, initialize it again. */ -+ init_highlight(TRUE, FALSE); - } -- /* We now have a different color setup, initialize it again. */ -- init_highlight(TRUE, FALSE); - } - ttest(FALSE); - if (varp == &T_ME) - { - out_str(T_ME); -@@ -6053,27 +6132,30 @@ did_set_string_option(opt_idx, varp, new - else - # endif - errmsg = (char_u *)N_("E596: Invalid font(s)"); - } - } -+ redraw_gui_only = TRUE; - } - # ifdef FEAT_XFONTSET - else if (varp == &p_guifontset) - { - if (STRCMP(p_guifontset, "*") == 0) - errmsg = (char_u *)N_("E597: can't select fontset"); - else if (gui.in_use && gui_init_font(p_guifontset, TRUE) != OK) - errmsg = (char_u *)N_("E598: Invalid fontset"); -+ redraw_gui_only = TRUE; - } - # endif - # ifdef FEAT_MBYTE - else if (varp == &p_guifontwide) - { - if (STRCMP(p_guifontwide, "*") == 0) - errmsg = (char_u *)N_("E533: can't select wide font"); - else if (gui_get_wide_font() == FAIL) - errmsg = (char_u *)N_("E534: Invalid wide font"); -+ redraw_gui_only = TRUE; - } - # endif - #endif - - #ifdef CURSOR_SHAPE -@@ -6131,17 +6213,28 @@ did_set_string_option(opt_idx, varp, new - #endif - - #ifdef FEAT_GUI - /* 'guioptions' */ - else if (varp == &p_go) -+ { - gui_init_which_components(oldval); -+ redraw_gui_only = TRUE; -+ } - #endif - - #if defined(FEAT_GUI_TABLINE) - /* 'guitablabel' */ - else if (varp == &p_gtl) -+ { - redraw_tabline = TRUE; -+ redraw_gui_only = TRUE; -+ } -+ /* 'guitabtooltip' */ -+ else if (varp == &p_gtt) -+ { -+ redraw_gui_only = TRUE; -+ } - #endif - - #if defined(FEAT_MOUSE_TTY) && (defined(UNIX) || defined(VMS)) - /* 'ttymouse' */ - else if (varp == &p_ttym) -@@ -6319,10 +6412,13 @@ did_set_string_option(opt_idx, varp, new - curwin->w_redr_status = TRUE; - redraw_later(VALID); - } - # endif - curbuf->b_help = (curbuf->b_p_bt[0] == 'h'); -+# ifdef FEAT_TITLE -+ redraw_titles(); -+# endif - } - } - #endif - - #ifdef FEAT_STL_OPT -@@ -6488,11 +6584,15 @@ did_set_string_option(opt_idx, varp, new - { - if (check_opt_strings(*varp, p_fdm_values, FALSE) != OK - || *curwin->w_p_fdm == NUL) - errmsg = e_invarg; - else -+ { - foldUpdateAll(curwin); -+ if (foldmethodIsDiff(curwin)) -+ newFoldLevel(); -+ } - } - # ifdef FEAT_EVAL - /* 'foldexpr' */ - else if (varp == &curwin->w_p_fde) - { -@@ -6715,11 +6815,15 @@ did_set_string_option(opt_idx, varp, new - } - #endif - - if (curwin->w_curswant != MAXCOL) - curwin->w_set_curswant = TRUE; /* in case 'showbreak' changed */ -- check_redraw(options[opt_idx].flags); -+#ifdef FEAT_GUI -+ /* check redraw when it's not a GUI option or the GUI is active. */ -+ if (!redraw_gui_only || gui.in_use) -+#endif -+ check_redraw(options[opt_idx].flags); - - return errmsg; - } - - /* -@@ -6930,10 +7034,11 @@ check_stl_option(s) - check_clipboard_option() - { - int new_unnamed = FALSE; - int new_autoselect = FALSE; - int new_autoselectml = FALSE; -+ int new_html = FALSE; - regprog_T *new_exclude_prog = NULL; - char_u *errmsg = NULL; - char_u *p; - - for (p = p_cb; *p != NUL; ) -@@ -6953,10 +7058,15 @@ check_clipboard_option() - && (p[12] == ',' || p[12] == NUL)) - { - new_autoselectml = TRUE; - p += 12; - } -+ else if (STRNCMP(p, "html", 4) == 0 && (p[4] == ',' || p[4] == NUL)) -+ { -+ new_html = TRUE; -+ p += 4; -+ } - else if (STRNCMP(p, "exclude:", 8) == 0 && new_exclude_prog == NULL) - { - p += 8; - new_exclude_prog = vim_regcomp(p, RE_MAGIC); - if (new_exclude_prog == NULL) -@@ -6974,10 +7084,11 @@ check_clipboard_option() - if (errmsg == NULL) - { - clip_unnamed = new_unnamed; - clip_autoselect = new_autoselect; - clip_autoselectml = new_autoselectml; -+ clip_html = new_html; - vim_free(clip_exclude_prog); - clip_exclude_prog = new_exclude_prog; - } - else - vim_free(new_exclude_prog); -@@ -7092,10 +7203,18 @@ set_bool_option(opt_idx, varp, value, op - if ((int *)varp == &p_cp) - { - compatible_set(); - } - -+ /* 'list', 'number' */ -+ else if ((int *)varp == &curwin->w_p_list -+ || (int *)varp == &curwin->w_p_nu) -+ { -+ if (curwin->w_curswant != MAXCOL) -+ curwin->w_set_curswant = TRUE; -+ } -+ - else if ((int *)varp == &curbuf->b_p_ro) - { - /* when 'readonly' is reset globally, also reset readonlymode */ - if (!curbuf->b_p_ro && (opt_flags & OPT_LOCAL) == 0) - readonlymode = FALSE; -@@ -7103,34 +7222,40 @@ set_bool_option(opt_idx, varp, value, op - /* when 'readonly' is set may give W10 again */ - if (curbuf->b_p_ro) - curbuf->b_did_warn = FALSE; - - #ifdef FEAT_TITLE -- need_maketitle = TRUE; -+ redraw_titles(); - #endif - } - - #ifdef FEAT_TITLE - /* when 'modifiable' is changed, redraw the window title */ - else if ((int *)varp == &curbuf->b_p_ma) -- need_maketitle = TRUE; -+ { -+ redraw_titles(); -+ } - /* when 'endofline' is changed, redraw the window title */ - else if ((int *)varp == &curbuf->b_p_eol) -- need_maketitle = TRUE; --#ifdef FEAT_MBYTE -- /* when 'bomb' is changed, redraw the window title */ -+ { -+ redraw_titles(); -+ } -+# ifdef FEAT_MBYTE -+ /* when 'bomb' is changed, redraw the window title and tab page text */ - else if ((int *)varp == &curbuf->b_p_bomb) -- need_maketitle = TRUE; --#endif -+ { -+ redraw_titles(); -+ } -+# endif - #endif - - /* when 'bin' is set also set some other options */ - else if ((int *)varp == &curbuf->b_p_bin) - { - set_options_bin(old_value, curbuf->b_p_bin, opt_flags); - #ifdef FEAT_TITLE -- need_maketitle = TRUE; -+ redraw_titles(); - #endif - } - - #ifdef FEAT_AUTOCMD - /* when 'buflisted' changes, trigger autocommands */ -@@ -7277,11 +7402,11 @@ set_bool_option(opt_idx, varp, value, op - else if ((int *)varp == &curbuf->b_changed) - { - if (!value) - save_file_ff(curbuf); /* Buffer is unchanged */ - #ifdef FEAT_TITLE -- need_maketitle = TRUE; -+ redraw_titles(); - #endif - #ifdef FEAT_AUTOCMD - modified_was_set = value; - #endif - } -@@ -7314,10 +7439,12 @@ set_bool_option(opt_idx, varp, value, op - /* If 'wrap' is set, set w_leftcol to zero. */ - else if ((int *)varp == &curwin->w_p_wrap) - { - if (curwin->w_p_wrap) - curwin->w_leftcol = 0; -+ if (curwin->w_curswant != MAXCOL) -+ curwin->w_set_curswant = TRUE; - } - - #ifdef FEAT_WINDOWS - else if ((int *)varp == &p_ea) - { -@@ -7484,13 +7611,17 @@ set_bool_option(opt_idx, varp, value, op - - /* Arabic requires a utf-8 encoding, inform the user if its not - * set. */ - if (STRCMP(p_enc, "utf-8") != 0) - { -+ static char *w_arabic = N_("W17: Arabic requires UTF-8, do ':set encoding=utf-8'"); -+ - msg_source(hl_attr(HLF_W)); -- MSG_ATTR(_("W17: Arabic requires UTF-8, do ':set encoding=utf-8'"), -- hl_attr(HLF_W)); -+ MSG_ATTR(_(w_arabic), hl_attr(HLF_W)); -+#ifdef FEAT_EVAL -+ set_vim_var_string(VV_WARNINGMSG, (char_u *)_(w_arabic), -1); -+#endif - } - - # ifdef FEAT_MBYTE - /* set 'delcombine' */ - p_deco = TRUE; -@@ -7533,22 +7664,45 @@ set_bool_option(opt_idx, varp, value, op - /* Revert to the default keymap */ - curbuf->b_p_iminsert = B_IMODE_NONE; - curbuf->b_p_imsearch = B_IMODE_USE_INSERT; - # endif - } -+ if (curwin->w_curswant != MAXCOL) -+ curwin->w_set_curswant = TRUE; -+ } -+ -+ else if ((int *)varp == &p_arshape) -+ { -+ if (curwin->w_curswant != MAXCOL) -+ curwin->w_set_curswant = TRUE; -+ } -+#endif -+ -+#ifdef FEAT_LINEBREAK -+ if ((int *)varp == &curwin->w_p_lbr) -+ { -+ if (curwin->w_curswant != MAXCOL) -+ curwin->w_set_curswant = TRUE; -+ } -+#endif -+ -+#ifdef FEAT_RIGHTLEFT -+ if ((int *)varp == &curwin->w_p_rl) -+ { -+ if (curwin->w_curswant != MAXCOL) -+ curwin->w_set_curswant = TRUE; - } - #endif - - /* - * End of handling side effects for bool options. - */ - - options[opt_idx].flags |= P_WAS_SET; - - comp_col(); /* in case 'ruler' or 'showcmd' changed */ -- if (curwin->w_curswant != MAXCOL) -- curwin->w_set_curswant = TRUE; /* in case 'list' changed */ -+ - check_redraw(options[opt_idx].flags); - - return NULL; - } - -@@ -7712,11 +7866,11 @@ set_num_option(opt_idx, varp, value, err - if (curwin->w_p_fdl < 0) - curwin->w_p_fdl = 0; - newFoldLevel(); - } - -- /* 'foldminlevel' */ -+ /* 'foldminlines' */ - else if (pp == &curwin->w_p_fml) - { - foldUpdateAll(curwin); - } - -@@ -7972,10 +8126,15 @@ set_num_option(opt_idx, varp, value, err - else if (curwin->w_p_scr <= 0) - curwin->w_p_scr = 1; - else /* curwin->w_p_scr > curwin->w_height */ - curwin->w_p_scr = curwin->w_height; - } -+ if (p_hi < 0) -+ { -+ errmsg = e_positive; -+ p_hi = 0; -+ } - if (p_report < 0) - { - errmsg = e_positive; - p_report = 1; - } -@@ -8225,17 +8384,17 @@ set_option_value(name, number, string, o - varp = get_varp_scope(&(options[opt_idx]), opt_flags); - if (varp != NULL) /* hidden option is not changed */ - { - if (number == 0 && string != NULL) - { -- int index; -+ int idx; - - /* Either we are given a string or we are setting option - * to zero. */ -- for (index = 0; string[index] == '0'; ++index) -+ for (idx = 0; string[idx] == '0'; ++idx) - ; -- if (string[index] != NUL || index == 0) -+ if (string[idx] != NUL || idx == 0) - { - /* There's another character after zeros or the string - * is empty. In both cases, we are trying to set a - * num option using a string. */ - EMSG3(_("E521: Number required: &%s = '%s'"), -@@ -8321,11 +8480,11 @@ find_key_option(arg) - key = TERMCAP2KEY(arg[2], arg[3]); - else - { - --arg; /* put arg at the '<' */ - modifiers = 0; -- key = find_special_key(&arg, &modifiers, TRUE); -+ key = find_special_key(&arg, &modifiers, TRUE, TRUE); - if (modifiers) /* can't handle modifiers here */ - key = 0; - } - return key; - } -@@ -8811,10 +8970,32 @@ free_termoptions() - } - clear_termcodes(); - } - - /* -+ * Free the string for one term option, if it was allocated. -+ * Set the string to empty_option and clear allocated flag. -+ * "var" points to the option value. -+ */ -+ void -+free_one_termoption(var) -+ char_u *var; -+{ -+ struct vimoption *p; -+ -+ for (p = &options[0]; p->fullname != NULL; p++) -+ if (p->var == var) -+ { -+ if (p->flags & P_ALLOCED) -+ free_string_option(*(char_u **)(p->var)); -+ *(char_u **)(p->var) = empty_option; -+ p->flags &= ~P_ALLOCED; -+ break; -+ } -+} -+ -+/* - * Set the terminal option defaults to the current value. - * Used after setting the terminal name. - */ - void - set_term_defaults() -@@ -9269,14 +9450,13 @@ check_win_options(win) - } - - /* - * Check for NULL pointers in a winopt_T and replace them with empty_option. - */ --/*ARGSUSED*/ - void - check_winopt(wop) -- winopt_T *wop; -+ winopt_T *wop UNUSED; - { - #ifdef FEAT_FOLDING - check_string_option(&wop->wo_fdi); - check_string_option(&wop->wo_fdm); - # ifdef FEAT_EVAL -@@ -9294,14 +9474,13 @@ check_winopt(wop) - } - - /* - * Free the allocated memory inside a winopt_T. - */ --/*ARGSUSED*/ - void - clear_winopt(wop) -- winopt_T *wop; -+ winopt_T *wop UNUSED; - { - #ifdef FEAT_FOLDING - clear_string_option(&wop->wo_fdi); - clear_string_option(&wop->wo_fdm); - # ifdef FEAT_EVAL -@@ -9643,11 +9822,11 @@ set_context_in_set_cmd(xp, arg, opt_flag - ++p; - break; - } - --p; - } -- if (STRNCMP(p, "no", 2) == 0) -+ if (STRNCMP(p, "no", 2) == 0 && STRNCMP(p, "novice", 6) != 0) - { - xp->xp_context = EXPAND_BOOL_SETTINGS; - p += 2; - } - if (STRNCMP(p, "inv", 3) == 0) -@@ -9832,11 +10011,12 @@ ExpandSettings(xp, regmatch, num_file, f - for (loop = 0; loop <= 1; ++loop) - { - regmatch->rm_ic = ic; - if (xp->xp_context != EXPAND_BOOL_SETTINGS) - { -- for (match = 0; match < sizeof(names) / sizeof(char *); ++match) -+ for (match = 0; match < (int)(sizeof(names) / sizeof(char *)); -+ ++match) - if (vim_regexec(regmatch, (char_u *)names[match], (colnr_T)0)) - { - if (loop == 0) - num_normal++; - else -@@ -10091,29 +10271,114 @@ wc_use_keyname(varp, wcp) - return FALSE; - } - - #ifdef FEAT_LANGMAP - /* -- * Any character has an equivalent character. This is used for keyboards that -- * have a special language mode that sends characters above 128 (although -- * other characters can be translated too). -+ * Any character has an equivalent 'langmap' character. This is used for -+ * keyboards that have a special language mode that sends characters above -+ * 128 (although other characters can be translated too). The "to" field is a -+ * Vim command character. This avoids having to switch the keyboard back to -+ * ASCII mode when leaving Insert mode. -+ * -+ * langmap_mapchar[] maps any of 256 chars to an ASCII char used for Vim -+ * commands. -+ * When FEAT_MBYTE is defined langmap_mapga.ga_data is a sorted table of -+ * langmap_entry_T. This does the same as langmap_mapchar[] for characters >= -+ * 256. - */ -+# ifdef FEAT_MBYTE -+/* -+ * With multi-byte support use growarray for 'langmap' chars >= 256 -+ */ -+typedef struct -+{ -+ int from; -+ int to; -+} langmap_entry_T; -+ -+static garray_T langmap_mapga; -+static void langmap_set_entry __ARGS((int from, int to)); -+ -+/* -+ * Search for an entry in "langmap_mapga" for "from". If found set the "to" -+ * field. If not found insert a new entry at the appropriate location. -+ */ -+ static void -+langmap_set_entry(from, to) -+ int from; -+ int to; -+{ -+ langmap_entry_T *entries = (langmap_entry_T *)(langmap_mapga.ga_data); -+ int a = 0; -+ int b = langmap_mapga.ga_len; -+ -+ /* Do a binary search for an existing entry. */ -+ while (a != b) -+ { -+ int i = (a + b) / 2; -+ int d = entries[i].from - from; -+ -+ if (d == 0) -+ { -+ entries[i].to = to; -+ return; -+ } -+ if (d < 0) -+ a = i + 1; -+ else -+ b = i; -+ } -+ -+ if (ga_grow(&langmap_mapga, 1) != OK) -+ return; /* out of memory */ -+ -+ /* insert new entry at position "a" */ -+ entries = (langmap_entry_T *)(langmap_mapga.ga_data) + a; -+ mch_memmove(entries + 1, entries, -+ (langmap_mapga.ga_len - a) * sizeof(langmap_entry_T)); -+ ++langmap_mapga.ga_len; -+ entries[0].from = from; -+ entries[0].to = to; -+} - - /* -- * char_u langmap_mapchar[256]; -- * Normally maps each of the 128 upper chars to an <128 ascii char; used to -- * "translate" native lang chars in normal mode or some cases of -- * insert mode without having to tediously switch lang mode back&forth. -+ * Apply 'langmap' to multi-byte character "c" and return the result. - */ -+ int -+langmap_adjust_mb(c) -+ int c; -+{ -+ langmap_entry_T *entries = (langmap_entry_T *)(langmap_mapga.ga_data); -+ int a = 0; -+ int b = langmap_mapga.ga_len; -+ -+ while (a != b) -+ { -+ int i = (a + b) / 2; -+ int d = entries[i].from - c; -+ -+ if (d == 0) -+ return entries[i].to; /* found matching entry */ -+ if (d < 0) -+ a = i + 1; -+ else -+ b = i; -+ } -+ return c; /* no entry found, return "c" unmodified */ -+} -+# endif - - static void - langmap_init() - { - int i; - -- for (i = 0; i < 256; i++) /* we init with a-one-to one map */ -- langmap_mapchar[i] = i; -+ for (i = 0; i < 256; i++) -+ langmap_mapchar[i] = i; /* we init with a one-to-one map */ -+# ifdef FEAT_MBYTE -+ ga_init2(&langmap_mapga, sizeof(langmap_entry_T), 8); -+# endif - } - - /* - * Called when langmap option is set; the language map can be - * changed at any time! -@@ -10123,11 +10388,14 @@ langmap_set() - { - char_u *p; - char_u *p2; - int from, to; - -- langmap_init(); /* back to one-to-one map first */ -+#ifdef FEAT_MBYTE -+ ga_clear(&langmap_mapga); /* clear the previous map first */ -+#endif -+ langmap_init(); /* back to one-to-one map */ - - for (p = p_langmap; p[0] != NUL; ) - { - for (p2 = p; p2[0] != NUL && p2[0] != ',' && p2[0] != ';'; - mb_ptr_adv(p2)) -@@ -10173,11 +10441,17 @@ langmap_set() - { - EMSG2(_("E357: 'langmap': Matching character missing for %s"), - transchar(from)); - return; - } -- langmap_mapchar[from & 255] = to; -+ -+#ifdef FEAT_MBYTE -+ if (from >= 256) -+ langmap_set_entry(from, to); -+ else -+#endif -+ langmap_mapchar[from & 255] = to; - - /* Advance to next pair */ - mb_ptr_adv(p); - if (p2 == NULL) - { ---- vim72.orig/src/option.h -+++ vim72/src/option.h -@@ -31,11 +31,11 @@ - # define DFLT_EFM "%A%p^,%C%%CC-%t-%m,%Cat line number %l in file %f,%f|%l| %m" - # else /* Unix, probably */ - # ifdef EBCDIC - #define DFLT_EFM "%*[^ ] %*[^ ] %f:%l%*[ ]%m,%*[^\"]\"%f\"%*\\D%l: %m,\"%f\"%*\\D%l: %m,%f:%l:%c:%m,%f(%l):%m,%f:%l:%m,\"%f\"\\, line %l%*\\D%c%*[^ ] %m,%D%*\\a[%*\\d]: Entering directory `%f',%X%*\\a[%*\\d]: Leaving directory `%f',%DMaking %*\\a in %f,%f|%l| %m" - # else --#define DFLT_EFM "%*[^\"]\"%f\"%*\\D%l: %m,\"%f\"%*\\D%l: %m,%-G%f:%l: (Each undeclared identifier is reported only once,%-G%f:%l: for each function it appears in.),%f:%l:%c:%m,%f(%l):%m,%f:%l:%m,\"%f\"\\, line %l%*\\D%c%*[^ ] %m,%D%*\\a[%*\\d]: Entering directory `%f',%X%*\\a[%*\\d]: Leaving directory `%f',%D%*\\a: Entering directory `%f',%X%*\\a: Leaving directory `%f',%DMaking %*\\a in %f,%f|%l| %m" -+#define DFLT_EFM "%*[^\"]\"%f\"%*\\D%l: %m,\"%f\"%*\\D%l: %m,%-G%f:%l: (Each undeclared identifier is reported only once,%-G%f:%l: for each function it appears in.),%-GIn file included from %f:%l:%c,%-GIn file included from %f:%l,%-Gfrom %f:%l:%c,%-Gfrom %f:%l,%f:%l:%c:%m,%f(%l):%m,%f:%l:%m,\"%f\"\\, line %l%*\\D%c%*[^ ] %m,%D%*\\a[%*\\d]: Entering directory `%f',%X%*\\a[%*\\d]: Leaving directory `%f',%D%*\\a: Entering directory `%f',%X%*\\a: Leaving directory `%f',%DMaking %*\\a in %f,%f|%l| %m" - # endif - # endif - # endif - # endif - # endif ---- vim72.orig/src/os_mac.h -+++ vim72/src/os_mac.h -@@ -266,13 +266,19 @@ - * version with os_unix.x instead of os_mac.c. Based on the result - * of ./configure for console MacOS X. - */ - - #ifdef MACOS_X_UNIX --# define SIGPROTOARG (int) --# define SIGDEFARG(s) (s) int s; --# define SIGDUMMYARG 0 -+# ifndef SIGPROTOARG -+# define SIGPROTOARG (int) -+# endif -+# ifndef SIGDEFARG -+# define SIGDEFARG(s) (s) int s UNUSED; -+# endif -+# ifndef SIGDUMMYARG -+# define SIGDUMMYARG 0 -+# endif - # undef HAVE_AVAIL_MEM - # ifndef HAVE_CONFIG_H - # define RETSIGTYPE void - # define SIGRETURN return - /*# define USE_SYSTEM */ /* Output ship do debugger :(, but ot compile */ -@@ -283,11 +289,10 @@ - # define HAVE_SYS_SELECT_H 1 - # define HAVE_PUTENV - # define HAVE_SETENV - # define HAVE_RENAME - # endif --# define mch_chdir(s) chdir(s) - #endif - - #if defined(MACOS_X) && !defined(HAVE_CONFIG_H) - # define HAVE_PUTENV - #endif ---- vim72.orig/src/os_msdos.c -+++ vim72/src/os_msdos.c -@@ -2037,10 +2037,16 @@ mch_has_wildcard(char_u *p) - int - mch_chdir(char *path) - { - if (path[0] == NUL) /* just checking... */ - return 0; -+ if (p_verbose >= 5) -+ { -+ verbose_enter(); -+ smsg((char_u *)"chdir(%s)", path); -+ verbose_leave(); -+ } - if (path[1] == ':') /* has a drive name */ - { - if (change_drive(TOLOWER_ASC(path[0]) - 'a' + 1)) - return -1; /* invalid drive name */ - path += 2; ---- vim72.orig/src/os_mswin.c -+++ vim72/src/os_mswin.c -@@ -307,11 +307,11 @@ mch_settitle( - { - # ifdef FEAT_MBYTE - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - { - /* Convert the title from 'encoding' to the active codepage. */ -- WCHAR *wp = enc_to_ucs2(title, NULL); -+ WCHAR *wp = enc_to_utf16(title, NULL); - int n; - - if (wp != NULL) - { - n = SetConsoleTitleW(wp); -@@ -404,14 +404,14 @@ mch_FullName( - /* Use the wide function: - * - convert the fname from 'encoding' to UCS2. - * - invoke _wfullpath() - * - convert the result from UCS2 to 'encoding'. - */ -- wname = enc_to_ucs2(fname, NULL); -+ wname = enc_to_utf16(fname, NULL); - if (wname != NULL && _wfullpath(wbuf, wname, MAX_PATH - 1) != NULL) - { -- cname = ucs2_to_enc((short_u *)wbuf, NULL); -+ cname = utf16_to_enc((short_u *)wbuf, NULL); - if (cname != NULL) - { - vim_strncpy(buf, cname, len - 1); - nResult = OK; - } -@@ -505,11 +505,11 @@ vim_stat(const char *name, struct stat * - /* Wide functions of Borland C 5.5 do not work on Windows 98. */ - && g_PlatformId == VER_PLATFORM_WIN32_NT - # endif - ) - { -- WCHAR *wp = enc_to_ucs2(buf, NULL); -+ WCHAR *wp = enc_to_utf16(buf, NULL); - int n; - - if (wp != NULL) - { - n = _wstat(wp, (struct _stat *)stp); -@@ -651,10 +651,16 @@ mch_has_wildcard(char_u *p) - mch_chdir(char *path) - { - if (path[0] == NUL) /* just checking... */ - return -1; - -+ if (p_verbose >= 5) -+ { -+ verbose_enter(); -+ smsg((char_u *)"chdir(%s)", path); -+ verbose_leave(); -+ } - if (isalpha(path[0]) && path[1] == ':') /* has a drive name */ - { - /* If we can change to the drive, skip that part of the path. If we - * can't then the current directory may be invalid, try using chdir() - * with the whole path. */ -@@ -666,11 +672,11 @@ mch_chdir(char *path) - return 0; - - #ifdef FEAT_MBYTE - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - { -- WCHAR *p = enc_to_ucs2(path, NULL); -+ WCHAR *p = enc_to_utf16(path, NULL); - int n; - - if (p != NULL) - { - n = _wchdir(p); -@@ -889,23 +895,24 @@ mch_libcall( - } - #endif - - #if defined(FEAT_MBYTE) || defined(PROTO) - /* -- * Convert an UTF-8 string to UCS-2. -+ * Convert an UTF-8 string to UTF-16. - * "instr[inlen]" is the input. "inlen" is in bytes. -- * When "outstr" is NULL only return the number of UCS-2 words produced. -+ * When "outstr" is NULL only return the number of UTF-16 words produced. - * Otherwise "outstr" must be a buffer of sufficient size. -- * Returns the number of UCS-2 words produced. -+ * Returns the number of UTF-16 words produced. - */ - int --utf8_to_ucs2(char_u *instr, int inlen, short_u *outstr, int *unconvlenp) -+utf8_to_utf16(char_u *instr, int inlen, short_u *outstr, int *unconvlenp) - { - int outlen = 0; - char_u *p = instr; - int todo = inlen; - int l; -+ int ch; - - while (todo > 0) - { - /* Only convert if we have a complete sequence. */ - l = utf_ptr2len_len(p, todo); -@@ -915,44 +922,68 @@ utf8_to_ucs2(char_u *instr, int inlen, s - if (unconvlenp != NULL) - *unconvlenp = todo; - break; - } - -- if (outstr != NULL) -- *outstr++ = utf_ptr2char(p); -+ ch = utf_ptr2char(p); -+ if (ch >= 0x10000) -+ { -+ /* non-BMP character, encoding with surrogate pairs */ -+ ++outlen; -+ if (outstr != NULL) -+ { -+ *outstr++ = (0xD800 - (0x10000 >> 10)) + (ch >> 10); -+ *outstr++ = 0xDC00 | (ch & 0x3FF); -+ } -+ } -+ else if (outstr != NULL) -+ *outstr++ = ch; - ++outlen; - p += l; - todo -= l; - } - - return outlen; - } - - /* -- * Convert an UCS-2 string to UTF-8. -- * The input is "instr[inlen]" with "inlen" in number of ucs-2 words. -+ * Convert an UTF-16 string to UTF-8. -+ * The input is "instr[inlen]" with "inlen" in number of UTF-16 words. - * When "outstr" is NULL only return the required number of bytes. - * Otherwise "outstr" must be a buffer of sufficient size. - * Return the number of bytes produced. - */ - int --ucs2_to_utf8(short_u *instr, int inlen, char_u *outstr) -+utf16_to_utf8(short_u *instr, int inlen, char_u *outstr) - { - int outlen = 0; - int todo = inlen; - short_u *p = instr; - int l; -+ int ch, ch2; - - while (todo > 0) - { -+ ch = *p; -+ if (ch >= 0xD800 && ch <= 0xDBFF && todo > 1) -+ { -+ /* surrogate pairs handling */ -+ ch2 = p[1]; -+ if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) -+ { -+ ch = ((ch - 0xD800) << 10) + (ch2 & 0x3FF) + 0x10000; -+ ++p; -+ --todo; -+ } -+ } - if (outstr != NULL) - { -- l = utf_char2bytes(*p, outstr); -+ l = utf_char2bytes(ch, outstr); - outstr += l; - } - else -- l = utf_char2len(*p); -+ l = utf_char2len(ch); - ++p; - outlen += l; - --todo; - } - -@@ -1077,18 +1108,18 @@ crnl_to_nl(const char_u *str, int *size) - * Note: the following two functions are only guaranteed to work when using - * valid MS-Windows codepages or when iconv() is available. - */ - - /* -- * Convert "str" from 'encoding' to UCS-2. -+ * Convert "str" from 'encoding' to UTF-16. - * Input in "str" with length "*lenp". When "lenp" is NULL, use strlen(). - * Output is returned as an allocated string. "*lenp" is set to the length of - * the result. A trailing NUL is always added. - * Returns NULL when out of memory. - */ - short_u * --enc_to_ucs2(char_u *str, int *lenp) -+enc_to_utf16(char_u *str, int *lenp) - { - vimconv_T conv; - WCHAR *ret; - char_u *allocbuf = NULL; - int len_loc; -@@ -1100,11 +1131,11 @@ enc_to_ucs2(char_u *str, int *lenp) - lenp = &len_loc; - } - - if (enc_codepage > 0) - { -- /* We can do any CP### -> UCS-2 in one pass, and we can do it -+ /* We can do any CP### -> UTF-16 in one pass, and we can do it - * without iconv() (convert_* may need iconv). */ - MultiByteToWideChar_alloc(enc_codepage, 0, str, *lenp, &ret, &length); - } - else - { -@@ -1121,15 +1152,15 @@ enc_to_ucs2(char_u *str, int *lenp) - if (str == NULL) - return NULL; - } - convert_setup(&conv, NULL, NULL); - -- length = utf8_to_ucs2(str, *lenp, NULL, NULL); -+ length = utf8_to_utf16(str, *lenp, NULL, NULL); - ret = (WCHAR *)alloc((unsigned)((length + 1) * sizeof(WCHAR))); - if (ret != NULL) - { -- utf8_to_ucs2(str, *lenp, (short_u *)ret, NULL); -+ utf8_to_utf16(str, *lenp, (short_u *)ret, NULL); - ret[length] = 0; - } - - vim_free(allocbuf); - } -@@ -1137,19 +1168,19 @@ enc_to_ucs2(char_u *str, int *lenp) - *lenp = length; - return (short_u *)ret; - } - - /* -- * Convert an UCS-2 string to 'encoding'. -+ * Convert an UTF-16 string to 'encoding'. - * Input in "str" with length (counted in wide characters) "*lenp". When - * "lenp" is NULL, use wcslen(). - * Output is returned as an allocated string. If "*lenp" is not NULL it is - * set to the length of the result. - * Returns NULL when out of memory. - */ - char_u * --ucs2_to_enc(short_u *str, int *lenp) -+utf16_to_enc(short_u *str, int *lenp) - { - vimconv_T conv; - char_u *utf8_str = NULL, *enc_str = NULL; - int len_loc; - -@@ -1159,24 +1190,24 @@ ucs2_to_enc(short_u *str, int *lenp) - lenp = &len_loc; - } - - if (enc_codepage > 0) - { -- /* We can do any UCS-2 -> CP### in one pass. */ -+ /* We can do any UTF-16 -> CP### in one pass. */ - int length; - - WideCharToMultiByte_alloc(enc_codepage, 0, str, *lenp, - (LPSTR *)&enc_str, &length, 0, 0); - *lenp = length; - return enc_str; - } - - /* Avoid allocating zero bytes, it generates an error message. */ -- utf8_str = alloc(ucs2_to_utf8(str, *lenp == 0 ? 1 : *lenp, NULL)); -+ utf8_str = alloc(utf16_to_utf8(str, *lenp == 0 ? 1 : *lenp, NULL)); - if (utf8_str != NULL) - { -- *lenp = ucs2_to_utf8(str, *lenp, utf8_str); -+ *lenp = utf16_to_utf8(str, *lenp, utf8_str); - - /* We might be called before we have p_enc set up. */ - conv.vc_type = CONV_NONE; - convert_setup(&conv, (char_u *)"utf-8", - p_enc? p_enc: (char_u *)"latin1"); -@@ -1197,10 +1228,29 @@ ucs2_to_enc(short_u *str, int *lenp) - return enc_str; - } - #endif /* FEAT_MBYTE */ - - /* -+ * Wait for another process to Close the Clipboard. -+ * Returns TRUE for success. -+ */ -+ static int -+vim_open_clipboard(void) -+{ -+ int delay = 10; -+ -+ while (!OpenClipboard(NULL)) -+ { -+ if (delay > 500) -+ return FALSE; /* waited too long, give up */ -+ Sleep(delay); -+ delay *= 2; /* wait for 10, 20, 40, 80, etc. msec */ -+ } -+ return TRUE; -+} -+ -+/* - * Get the current selection and put it in the clipboard register. - * - * NOTE: Must use GlobalLock/Unlock here to ensure Win32s compatibility. - * On NT/W95 the clipboard data is a fixed global memory object and - * so its handle = its pointer. -@@ -1227,11 +1277,11 @@ clip_mch_request_selection(VimClipboard - - /* - * Don't pass GetActiveWindow() as an argument to OpenClipboard() because - * then we can't paste back into the same window for some reason - webb. - */ -- if (!OpenClipboard(NULL)) -+ if (!vim_open_clipboard()) - return; - - /* Check for vim's own clipboard format first. This only gets the type of - * the data, still need to use CF_UNICODETEXT or CF_TEXT for the text. */ - if (IsClipboardFormatAvailable(cbd->format)) -@@ -1306,11 +1356,11 @@ clip_mch_request_selection(VimClipboard - { - for (str_size = 0; str_size < maxlen; ++str_size) - if (hMemWstr[str_size] == NUL) - break; - } -- to_free = str = ucs2_to_enc((short_u *)hMemWstr, &str_size); -+ to_free = str = utf16_to_enc((short_u *)hMemWstr, &str_size); - GlobalUnlock(hMemW); - } - } - else - #endif -@@ -1338,11 +1388,11 @@ clip_mch_request_selection(VimClipboard - break; - } - - # if defined(FEAT_MBYTE) && defined(WIN3264) - /* The text is in the active codepage. Convert to 'encoding', -- * going through UCS-2. */ -+ * going through UTF-16. */ - acp_to_enc(str, str_size, &to_free, &maxlen); - if (to_free != NULL) - { - str_size = maxlen; - str = to_free; -@@ -1402,11 +1452,11 @@ acp_to_enc(str, str_size, out, outlen) - - MultiByteToWideChar_alloc(GetACP(), 0, str, str_size, &widestr, outlen); - if (widestr != NULL) - { - ++*outlen; /* Include the 0 after the string */ -- *out = ucs2_to_enc((short_u *)widestr, outlen); -+ *out = utf16_to_enc((short_u *)widestr, outlen); - vim_free(widestr); - } - } - #endif - -@@ -1464,13 +1514,13 @@ clip_mch_set_selection(VimClipboard *cbd - # if defined(FEAT_MBYTE) && defined(WIN3264) - { - WCHAR *out; - int len = metadata.txtlen; - -- /* Convert the text to UCS-2. This is put on the clipboard as -+ /* Convert the text to UTF-16. This is put on the clipboard as - * CF_UNICODETEXT. */ -- out = (WCHAR *)enc_to_ucs2(str, &len); -+ out = (WCHAR *)enc_to_utf16(str, &len); - if (out != NULL) - { - WCHAR *lpszMemW; - - /* Convert the text for CF_TEXT to Active codepage. Otherwise it's -@@ -1486,11 +1536,11 @@ clip_mch_set_selection(VimClipboard *cbd - return; /* out of memory */ - } - WideCharToMultiByte(GetACP(), 0, out, len, - str, metadata.txtlen, 0, 0); - -- /* Allocate memory for the UCS-2 text, add one NUL word to -+ /* Allocate memory for the UTF-16 text, add one NUL word to - * terminate the string. */ - hMemW = (LPSTR)GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, - (len + 1) * sizeof(WCHAR)); - lpszMemW = (WCHAR *)GlobalLock(hMemW); - if (lpszMemW != NULL) -@@ -1535,11 +1585,11 @@ clip_mch_set_selection(VimClipboard *cbd - * - * Don't pass GetActiveWindow() as an argument to OpenClipboard() - * because then we can't paste back into the same window for some - * reason - webb. - */ -- if (OpenClipboard(NULL)) -+ if (vim_open_clipboard()) - { - if (EmptyClipboard()) - { - SetClipboardData(cbd->format, hMemVim); - hMemVim = 0; ---- vim72.orig/src/os_riscos.c -+++ vim72/src/os_riscos.c -@@ -1201,10 +1201,16 @@ mch_chdir(dir) - { - int length; - int retval; - char_u *new_dir; - -+ if (p_verbose >= 5) -+ { -+ verbose_enter(); -+ smsg((char_u *)"chdir(%s)", dir); -+ verbose_leave(); -+ } - length = strlen(dir); - if (dir[length - 1] != '.') - return chdir(dir); /* No trailing dots - nothing to do. */ - new_dir = vim_strsave(dir); - if (new_dir == NULL) ---- vim72.orig/src/os_unix.c -+++ vim72/src/os_unix.c -@@ -179,11 +179,12 @@ static RETSIGTYPE catch_sigpwr __ARGS(SI - #endif - #if defined(SIGALRM) && defined(FEAT_X11) \ - && defined(FEAT_TITLE) && !defined(FEAT_GUI_GTK) - # define SET_SIG_ALARM - static RETSIGTYPE sig_alarm __ARGS(SIGPROTOARG); --static int sig_alarm_called; -+/* volatile because it is used in signal handler sig_alarm(). */ -+static volatile int sig_alarm_called; - #endif - static RETSIGTYPE deathtrap __ARGS(SIGPROTOARG); - - static void catch_int_signal __ARGS((void)); - static void set_signals __ARGS((void)); -@@ -199,17 +200,20 @@ static int save_patterns __ARGS((int num - - #ifndef SIG_ERR - # define SIG_ERR ((RETSIGTYPE (*)())-1) - #endif - --static int do_resize = FALSE; -+/* volatile because it is used in signal handler sig_winch(). */ -+static volatile int do_resize = FALSE; - #ifndef __EMX__ - static char_u *extra_shell_arg = NULL; - static int show_shell_mess = TRUE; - #endif --static int deadly_signal = 0; /* The signal we caught */ --static int in_mch_delay = FALSE; /* sleeping in mch_delay() */ -+/* volatile because it is used in signal handler deathtrap(). */ -+static volatile int deadly_signal = 0; /* The signal we caught */ -+/* volatile because it is used in signal handler deathtrap(). */ -+static volatile int in_mch_delay = FALSE; /* sleeping in mch_delay() */ - - static int curr_tmode = TMODE_COOK; /* contains current terminal mode */ - - #ifdef USE_XSMP - typedef struct -@@ -313,16 +317,36 @@ static struct signalinfo - {SIGPIPE, "PIPE", FALSE}, - #endif - {-1, "Unknown!", FALSE} - }; - -+ int -+mch_chdir(path) -+ char *path; -+{ -+ if (p_verbose >= 5) -+ { -+ verbose_enter(); -+ smsg((char_u *)"chdir(%s)", path); -+ verbose_leave(); -+ } -+# ifdef VMS -+ return chdir(vms_fixfilename(path)); -+# else -+ return chdir(path); -+# endif -+} -+ -+/* -+ * Write s[len] to the screen. -+ */ - void - mch_write(s, len) - char_u *s; - int len; - { -- write(1, (char *)s, len); -+ ignored = (int)write(1, (char *)s, len); - if (p_wd) /* Unix is too fast, slow down a bit more */ - RealWaitForChar(read_cmd_fd, p_wd, NULL); - } - - /* -@@ -445,14 +469,13 @@ mch_char_avail() - - /* - * Return total amount of memory available in Kbyte. - * Doesn't change when memory has been allocated. - */ --/* ARGSUSED */ - long_u - mch_total_mem(special) -- int special; -+ int special UNUSED; - { - # ifdef __EMX__ - return ulimit(3, 0L) >> 10; /* always 32MB? */ - # else - long_u mem = 0; -@@ -797,16 +820,15 @@ init_signal_stack() - } - } - #endif - - /* -- * We need correct potatotypes for a signal function, otherwise mean compilers -+ * We need correct prototypes for a signal function, otherwise mean compilers - * will barf when the second argument to signal() is ``wrong''. - * Let me try it with a few tricky defines from my own osdef.h (jw). - */ - #if defined(SIGWINCH) --/* ARGSUSED */ - static RETSIGTYPE - sig_winch SIGDEFARG(sigarg) - { - /* this is not required on all systems, but it doesn't hurt anybody */ - signal(SIGWINCH, (RETSIGTYPE (*)())sig_winch); -@@ -814,11 +836,10 @@ sig_winch SIGDEFARG(sigarg) - SIGRETURN; - } - #endif - - #if defined(SIGINT) --/* ARGSUSED */ - static RETSIGTYPE - catch_sigint SIGDEFARG(sigarg) - { - /* this is not required on all systems, but it doesn't hurt anybody */ - signal(SIGINT, (RETSIGTYPE (*)())catch_sigint); -@@ -826,11 +847,10 @@ catch_sigint SIGDEFARG(sigarg) - SIGRETURN; - } - #endif - - #if defined(SIGPWR) --/* ARGSUSED */ - static RETSIGTYPE - catch_sigpwr SIGDEFARG(sigarg) - { - /* this is not required on all systems, but it doesn't hurt anybody */ - signal(SIGPWR, (RETSIGTYPE (*)())catch_sigpwr); -@@ -846,11 +866,10 @@ catch_sigpwr SIGDEFARG(sigarg) - - #ifdef SET_SIG_ALARM - /* - * signal function for alarm(). - */ --/* ARGSUSED */ - static RETSIGTYPE - sig_alarm SIGDEFARG(sigarg) - { - /* doesn't do anything, just to break a system call */ - sig_alarm_called = TRUE; -@@ -1063,23 +1082,27 @@ deathtrap SIGDEFARG(sigarg) - #endif - - SIGRETURN; - } - --#ifdef _REENTRANT -+#if defined(_REENTRANT) && defined(SIGCONT) - /* - * On Solaris with multi-threading, suspending might not work immediately. - * Catch the SIGCONT signal, which will be used as an indication whether the - * suspending has been done or not. -+ * -+ * On Linux, signal is not always handled immediately either. -+ * See https://bugs.launchpad.net/bugs/291373 -+ * -+ * volatile because it is used in in signal handler sigcont_handler(). - */ --static int sigcont_received; -+static volatile int sigcont_received; - static RETSIGTYPE sigcont_handler __ARGS(SIGPROTOARG); - - /* - * signal handler for SIGCONT - */ --/* ARGSUSED */ - static RETSIGTYPE - sigcont_handler SIGDEFARG(sigarg) - { - sigcont_received = TRUE; - SIGRETURN; -@@ -1113,19 +1136,32 @@ mch_suspend() - if (x11_display != NULL) - XFlush(x11_display); - } - # endif - --# ifdef _REENTRANT -+# if defined(_REENTRANT) && defined(SIGCONT) - sigcont_received = FALSE; - # endif - kill(0, SIGTSTP); /* send ourselves a STOP signal */ --# ifdef _REENTRANT -- /* When we didn't suspend immediately in the kill(), do it now. Happens -- * on multi-threaded Solaris. */ -- if (!sigcont_received) -- pause(); -+# if defined(_REENTRANT) && defined(SIGCONT) -+ /* -+ * Wait for the SIGCONT signal to be handled. It generally happens -+ * immediately, but somehow not all the time. Do not call pause() -+ * because there would be race condition which would hang Vim if -+ * signal happened in between the test of sigcont_received and the -+ * call to pause(). If signal is not yet received, call sleep(0) -+ * to just yield CPU. Signal should then be received. If somehow -+ * it's still not received, sleep 1, 2, 3 ms. Don't bother waiting -+ * further if signal is not received after 1+2+3+4 ms (not expected -+ * to happen). -+ */ -+ { -+ long wait_time; -+ for (wait_time = 0; !sigcont_received && wait_time <= 3L; wait_time++) -+ /* Loop is not entered most of the time */ -+ mch_delay(wait_time, FALSE); -+ } - # endif - - # ifdef FEAT_TITLE - /* - * Set oldtitle to NULL, so the current title is obtained again. -@@ -1170,11 +1206,11 @@ set_signals() - * For "rvim" the STOP signal is ignored. - */ - #ifdef SIGTSTP - signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL); - #endif --#ifdef _REENTRANT -+#if defined(_REENTRANT) && defined(SIGCONT) - signal(SIGCONT, sigcont_handler); - #endif - - /* - * We want to ignore breaking of PIPEs. -@@ -1229,11 +1265,11 @@ catch_int_signal() - - void - reset_signals() - { - catch_signals(SIG_DFL, SIG_DFL); --#ifdef _REENTRANT -+#if defined(_REENTRANT) && defined(SIGCONT) - /* SIGCONT isn't in the list, because its default action is ignore */ - signal(SIGCONT, SIG_DFL); - #endif - } - -@@ -1324,15 +1360,14 @@ vim_handle_signal(sig) - } - - /* - * Check_win checks whether we have an interactive stdout. - */ --/* ARGSUSED */ - int - mch_check_win(argc, argv) -- int argc; -- char **argv; -+ int argc UNUSED; -+ char **argv UNUSED; - { - #ifdef OS2 - /* - * Store argv[0], may be used for $VIM. Only use it if it is an absolute - * name, mostly it's just "vim" and found in the path, which is unusable. -@@ -1412,15 +1447,14 @@ x_error_handler(dpy, error_event) - } - - /* - * Another X Error handler, just used to check for errors. - */ --/* ARGSUSED */ - static int - x_error_check(dpy, error_event) -- Display *dpy; -- XErrorEvent *error_event; -+ Display *dpy UNUSED; -+ XErrorEvent *error_event UNUSED; - { - got_x_error = TRUE; - return 0; - } - -@@ -1429,41 +1463,41 @@ x_error_check(dpy, error_event) - /* - * An X IO Error handler, used to catch error while opening the display. - */ - static int x_IOerror_check __ARGS((Display *dpy)); - --/* ARGSUSED */ - static int - x_IOerror_check(dpy) -- Display *dpy; -+ Display *dpy UNUSED; - { - /* This function should not return, it causes exit(). Longjump instead. */ - LONGJMP(lc_jump_env, 1); -- /*NOTREACHED*/ -- return 0; -+# ifdef VMS -+ return 0; /* avoid the compiler complains about missing return value */ -+# endif - } - # endif - - /* - * An X IO Error handler, used to catch terminal errors. - */ - static int x_IOerror_handler __ARGS((Display *dpy)); - --/* ARGSUSED */ - static int - x_IOerror_handler(dpy) -- Display *dpy; -+ Display *dpy UNUSED; - { - xterm_dpy = NULL; - x11_window = 0; - x11_display = NULL; - xterm_Shell = (Widget)0; - - /* This function should not return, it causes exit(). Longjump instead. */ - LONGJMP(x_jump_env, 1); -- /*NOTREACHED*/ -- return 0; -+# ifdef VMS -+ return 0; /* avoid the compiler complains about missing return value */ -+# endif - } - #endif - - /* - * Return TRUE when connection to the X server is desired. -@@ -1704,13 +1738,13 @@ get_x11_icon(test_only) - - /* could not get old icon, use terminal name */ - if (oldicon == NULL && !test_only) - { - if (STRNCMP(T_NAME, "builtin_", 8) == 0) -- oldicon = T_NAME + 8; -+ oldicon = vim_strsave(T_NAME + 8); - else -- oldicon = T_NAME; -+ oldicon = vim_strsave(T_NAME); - } - - return retval; - } - -@@ -1895,14 +1929,13 @@ set_x11_icon(icon) - XFlush(x11_display); - } - - #else /* FEAT_X11 */ - --/*ARGSUSED*/ - static int - get_x11_title(test_only) -- int test_only; -+ int test_only UNUSED; - { - return FALSE; - } - - static int -@@ -1910,13 +1943,13 @@ get_x11_icon(test_only) - int test_only; - { - if (!test_only) - { - if (STRNCMP(T_NAME, "builtin_", 8) == 0) -- oldicon = T_NAME + 8; -+ oldicon = vim_strsave(T_NAME + 8); - else -- oldicon = T_NAME; -+ oldicon = vim_strsave(T_NAME); - } - return FALSE; - } - - #endif /* FEAT_X11 */ -@@ -2412,10 +2445,16 @@ mch_FullName(fname, buf, len, force) - if (p != NULL) - { - #ifdef HAVE_FCHDIR - if (fd >= 0) - { -+ if (p_verbose >= 5) -+ { -+ verbose_enter(); -+ MSG("fchdir() to previous dir"); -+ verbose_leave(); -+ } - l = fchdir(fd); - close(fd); - } - else - #endif -@@ -2436,11 +2475,11 @@ mch_FullName(fname, buf, len, force) - } - #endif - } - - /* Catch file names which are too long. */ -- if (retval == FAIL || STRLEN(buf) + STRLEN(fname) >= len) -+ if (retval == FAIL || (int)(STRLEN(buf) + STRLEN(fname)) >= len) - return FAIL; - - /* Do not append ".", "/dir/." is equal to "/dir". */ - if (STRCMP(fname, ".") != 0) - STRCAT(buf, fname); -@@ -2473,15 +2512,14 @@ mch_isFullName(fname) - /* - * Set the case of the file name, if it already exists. This will cause the - * file name to remain exactly the same. - * Only required for file systems where case is ignored and preserved. - */ --/*ARGSUSED*/ - void - fname_case(name, len) - char_u *name; -- int len; /* buffer size, only used when name gets longer */ -+ int len UNUSED; /* buffer size, only used when name gets longer */ - { - struct stat st; - char_u *slash, *tail; - DIR *dirp; - struct dirent *dp; -@@ -2655,11 +2693,11 @@ mch_copy_sec(from_file, to_file) - * Return a pointer to the ACL of file "fname" in allocated memory. - * Return NULL if the ACL is not available for whatever reason. - */ - vim_acl_T - mch_get_acl(fname) -- char_u *fname; -+ char_u *fname UNUSED; - { - vim_acl_T ret = NULL; - #ifdef HAVE_POSIX_ACL - ret = (vim_acl_T)acl_get_file((char *)fname, ACL_TYPE_ACCESS); - #else -@@ -2715,11 +2753,11 @@ mch_get_acl(fname) - /* - * Set the ACL of file "fname" to "acl" (unless it's NULL). - */ - void - mch_set_acl(fname, aclent) -- char_u *fname; -+ char_u *fname UNUSED; - vim_acl_T aclent; - { - if (aclent == NULL) - return; - #ifdef HAVE_POSIX_ACL -@@ -2758,14 +2796,13 @@ mch_free_acl(aclent) - #endif - - /* - * Set hidden flag for "name". - */ --/* ARGSUSED */ - void - mch_hide(name) -- char_u *name; -+ char_u *name UNUSED; - { - /* can't hide a file */ - } - - /* -@@ -2903,11 +2940,11 @@ mch_early_init() - * running out of stack space. - * Use of sigaltstack() is preferred, it's more portable. - * Ignore any errors. - */ - #if defined(HAVE_SIGALTSTACK) || defined(HAVE_SIGSTACK) -- signal_stack = malloc(SIGSTKSZ); -+ signal_stack = (char *)alloc(SIGSTKSZ); - init_signal_stack(); - #endif - } - - #if defined(EXITFREE) || defined(PROTO) -@@ -2934,11 +2971,12 @@ mch_free_mem() - x11_display = NULL; /* freed by XtDestroyApplicationContext() */ - # endif - } - # endif - # endif --# ifdef FEAT_X11 -+ /* Don't close the display for GTK 1, it is done in exit(). */ -+# if defined(FEAT_X11) && (!defined(FEAT_GUI_GTK) || defined(HAVE_GTK2)) - if (x11_display != NULL - # ifdef FEAT_XCLIPBOARD - && x11_display != xterm_dpy - # endif - ) -@@ -3449,14 +3487,13 @@ check_mouse_termcode() - #endif - - /* - * set screen mode, always fails. - */ --/* ARGSUSED */ - int - mch_screenmode(arg) -- char_u *arg; -+ char_u *arg UNUSED; - { - EMSG(_(e_screenmode)); - return FAIL; - } - -@@ -3924,13 +3961,13 @@ mch_call_shell(cmd, options) - * or dup() failed we'd just do the same thing ourselves - * anyway -- webb - */ - if (fd >= 0) - { -- dup(fd); /* To replace stdin (file descriptor 0) */ -- dup(fd); /* To replace stdout (file descriptor 1) */ -- dup(fd); /* To replace stderr (file descriptor 2) */ -+ ignored = dup(fd); /* To replace stdin (fd 0) */ -+ ignored = dup(fd); /* To replace stdout (fd 1) */ -+ ignored = dup(fd); /* To replace stderr (fd 2) */ - - /* Don't need this now that we've duplicated it */ - close(fd); - } - } -@@ -3944,11 +3981,21 @@ mch_call_shell(cmd, options) - # ifdef HAVE_SETSID - /* Create our own process group, so that the child and all its - * children can be kill()ed. Don't do this when using pipes, - * because stdin is not a tty, we would lose /dev/tty. */ - if (p_stmp) -+ { - (void)setsid(); -+# if defined(SIGHUP) -+ /* When doing "!xterm&" and 'shell' is bash: the shell -+ * will exit and send SIGHUP to all processes in its -+ * group, killing the just started process. Ignore SIGHUP -+ * to avoid that. (suggested by Simon Schubert) -+ */ -+ signal(SIGHUP, SIG_IGN); -+# endif -+ } - # endif - # ifdef FEAT_GUI - if (pty_slave_fd >= 0) - { - /* push stream discipline modules */ -@@ -3994,42 +4041,42 @@ mch_call_shell(cmd, options) - { - close(pty_master_fd); /* close master side of pty */ - - /* set up stdin/stdout/stderr for the child */ - close(0); -- dup(pty_slave_fd); -+ ignored = dup(pty_slave_fd); - close(1); -- dup(pty_slave_fd); -+ ignored = dup(pty_slave_fd); - if (gui.in_use) - { - close(2); -- dup(pty_slave_fd); -+ ignored = dup(pty_slave_fd); - } - - close(pty_slave_fd); /* has been dupped, close it now */ - } - else - # endif - { - /* set up stdin for the child */ - close(fd_toshell[1]); - close(0); -- dup(fd_toshell[0]); -+ ignored = dup(fd_toshell[0]); - close(fd_toshell[0]); - - /* set up stdout for the child */ - close(fd_fromshell[0]); - close(1); -- dup(fd_fromshell[1]); -+ ignored = dup(fd_fromshell[1]); - close(fd_fromshell[1]); - - # ifdef FEAT_GUI - if (gui.in_use) - { - /* set up stderr for the child */ - close(2); -- dup(1); -+ ignored = dup(1); - } - # endif - } - } - -@@ -4076,10 +4123,13 @@ mch_call_shell(cmd, options) - int c; - int toshell_fd; - int fromshell_fd; - garray_T ga; - int noread_cnt; -+# if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H) -+ struct timeval start_tv; -+# endif - - # ifdef FEAT_GUI - if (pty_master_fd >= 0) - { - close(pty_slave_fd); /* close slave side of pty */ -@@ -4144,23 +4194,25 @@ mch_call_shell(cmd, options) - len = write(toshell_fd, "", (size_t)1); - else - { - s = vim_strchr(lp + written, NL); - len = write(toshell_fd, (char *)lp + written, -- s == NULL ? l : s - (lp + written)); -+ s == NULL ? l -+ : (size_t)(s - (lp + written))); - } -- if (len == l) -+ if (len == (int)l) - { - /* Finished a line, add a NL, unless this line - * should not have one. */ - if (lnum != curbuf->b_op_end.lnum - || !curbuf->b_p_bin - || (lnum != write_no_eol_lnum - && (lnum != - curbuf->b_ml.ml_line_count - || curbuf->b_p_eol))) -- write(toshell_fd, "\n", (size_t)1); -+ ignored = write(toshell_fd, "\n", -+ (size_t)1); - ++lnum; - if (lnum > curbuf->b_op_end.lnum) - { - /* finished all the lines, close pipe */ - close(toshell_fd); -@@ -4184,11 +4236,13 @@ mch_call_shell(cmd, options) - - if (options & SHELL_READ) - ga_init2(&ga, 1, BUFLEN); - - noread_cnt = 0; -- -+# if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H) -+ gettimeofday(&start_tv, NULL); -+# endif - for (;;) - { - /* - * Check if keys have been typed, write them to the child - * if there are any. -@@ -4197,29 +4251,38 @@ mch_call_shell(cmd, options) - * Don't do this when filtering and terminal is in cooked - * mode, the shell command will handle the I/O. Avoids - * that a typed password is echoed for ssh or gpg command. - * Don't get characters when the child has already - * finished (wait_pid == 0). -- * Don't get extra characters when we already have one. - * Don't read characters unless we didn't get output for a -- * while, avoids that ":r !ls" eats typeahead. -+ * while (noread_cnt > 4), avoids that ":r !ls" eats -+ * typeahead. - */ - len = 0; - if (!(options & SHELL_EXPAND) - && ((options & - (SHELL_READ|SHELL_WRITE|SHELL_COOKED)) - != (SHELL_READ|SHELL_WRITE|SHELL_COOKED) --#ifdef FEAT_GUI -+# ifdef FEAT_GUI - || gui.in_use --#endif -+# endif - ) - && wait_pid == 0 -- && (ta_len > 0 -- || (noread_cnt > 4 -- && (len = ui_inchar(ta_buf, -- BUFLEN, 10L, 0)) > 0))) -+ && (ta_len > 0 || noread_cnt > 4)) - { -+ if (ta_len == 0) -+ { -+ /* Get extra characters when we don't have any. -+ * Reset the counter and timer. */ -+ noread_cnt = 0; -+# if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H) -+ gettimeofday(&start_tv, NULL); -+# endif -+ len = ui_inchar(ta_buf, BUFLEN, 10L, 0); -+ } -+ if (ta_len > 0 || len > 0) -+ { - /* - * For pipes: - * Check for CTRL-C: send interrupt signal to child. - * Check for CTRL-D: EOF, close pipe to child. - */ -@@ -4269,11 +4332,12 @@ mch_call_shell(cmd, options) - } - else if (ta_buf[i] == '\r') - ta_buf[i] = '\n'; - # ifdef FEAT_MBYTE - if (has_mbyte) -- i += (*mb_ptr2len)(ta_buf + i) - 1; -+ i += (*mb_ptr2len_len)(ta_buf + i, -+ ta_len + len - i) - 1; - # endif - } - - /* - * For pipes: echo the typed characters. -@@ -4317,13 +4381,13 @@ mch_call_shell(cmd, options) - len = write(toshell_fd, (char *)ta_buf, (size_t)1); - if (len > 0) - { - ta_len -= len; - mch_memmove(ta_buf, ta_buf + len, ta_len); -- noread_cnt = 0; - } - } -+ } - } - - if (got_int) - { - /* CTRL-C sends a signal to the child, we ignore it -@@ -4427,10 +4491,29 @@ mch_call_shell(cmd, options) - windgoto(msg_row, msg_col); - cursor_on(); - out_flush(); - if (got_int) - break; -+ -+# if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H) -+ { -+ struct timeval now_tv; -+ long msec; -+ -+ /* Avoid that we keep looping here without -+ * checking for a CTRL-C for a long time. Don't -+ * break out too often to avoid losing typeahead. */ -+ gettimeofday(&now_tv, NULL); -+ msec = (now_tv.tv_sec - start_tv.tv_sec) * 1000L -+ + (now_tv.tv_usec - start_tv.tv_usec) / 1000L; -+ if (msec > 2000) -+ { -+ noread_cnt = 5; -+ break; -+ } -+ } -+# endif - } - - /* If we already detected the child has finished break the - * loop now. */ - if (wait_pid == pid) -@@ -4670,20 +4753,19 @@ WaitForChar(msec) - * Time == -1 will block forever. - * When a GUI is being used, this will not be used for input -- webb - * Returns also, when a request from Sniff is waiting -- toni. - * Or when a Linux GPM mouse event is waiting. - */ --/* ARGSUSED */ - #if defined(__BEOS__) - int - #else - static int - #endif - RealWaitForChar(fd, msec, check_for_gpm) - int fd; - long msec; -- int *check_for_gpm; -+ int *check_for_gpm UNUSED; - { - int ret; - #if defined(FEAT_XCLIPBOARD) || defined(USE_XSMP) || defined(FEAT_MZSCHEME) - static int busy = FALSE; - -@@ -5074,11 +5156,10 @@ mch_expandpath(gap, path, flags) - # define SEEK_END 2 - #endif - - #define SHELL_SPECIAL (char_u *)"\t \"&'$;<>()\\|" - --/* ARGSUSED */ - int - mch_expand_wildcards(num_pat, pat, num_file, file, flags) - int num_pat; - char_u **pat; - int *num_file; -@@ -5496,11 +5577,11 @@ mch_expand_wildcards(num_pat, pat, num_f - return FAIL; - } - i = fread((char *)buffer, 1, len, fd); - fclose(fd); - mch_remove(tempname); -- if (i != len) -+ if (i != (int)len) - { - /* unexpected read error */ - EMSG2(_(e_notread), tempname); - vim_free(tempname); - vim_free(buffer); -@@ -5557,11 +5638,11 @@ mch_expand_wildcards(num_pat, pat, num_f - */ - check_spaces = FALSE; - if (shell_style == STYLE_PRINT && !did_find_nul) - { - /* If there is a NUL, set did_find_nul, else set check_spaces */ -- if (len && (int)STRLEN(buffer) < len - 1) -+ if (len && (int)STRLEN(buffer) < (int)len - 1) - did_find_nul = TRUE; - else - check_spaces = TRUE; - } - -@@ -5849,11 +5930,13 @@ gpm_open() - /* gpm library tries to handling TSTP causes - * problems. Anyways, we close connection to Gpm whenever - * we are going to suspend or starting an external process - * so we shouldn't have problem with this - */ -+# ifdef SIGTSTP - signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL); -+# endif - return 1; /* succeed */ - } - if (gpm_fd == -2) - Gpm_Close(); /* We don't want to talk to xterm via gpm */ - return 0; -@@ -5999,11 +6082,10 @@ sysmouse_close() - } - - /* - * Gets info from sysmouse and adds special keys to input buf. - */ --/* ARGSUSED */ - static RETSIGTYPE - sig_sysmouse SIGDEFARG(sigarg) - { - struct mouse_info mouse; - struct video_info video; -@@ -6563,15 +6645,14 @@ static void xsmp_handle_interaction __AR - - /* - * This is our chance to ask the user if they want to save, - * or abort the logout - */ --/*ARGSUSED*/ - static void - xsmp_handle_interaction(smc_conn, client_data) - SmcConn smc_conn; -- SmPointer client_data; -+ SmPointer client_data UNUSED; - { - cmdmod_T save_cmdmod; - int cancel_shutdown = False; - - save_cmdmod = cmdmod; -@@ -6600,20 +6681,19 @@ xsmp_handle_interaction(smc_conn, client - # endif - - /* - * Callback that starts save-yourself. - */ --/*ARGSUSED*/ - static void - xsmp_handle_save_yourself(smc_conn, client_data, save_type, - shutdown, interact_style, fast) - SmcConn smc_conn; -- SmPointer client_data; -- int save_type; -+ SmPointer client_data UNUSED; -+ int save_type UNUSED; - Bool shutdown; -- int interact_style; -- Bool fast; -+ int interact_style UNUSED; -+ Bool fast UNUSED; - { - /* Handle already being in saveyourself */ - if (xsmp.save_yourself) - SmcSaveYourselfDone(smc_conn, True); - xsmp.save_yourself = True; -@@ -6643,15 +6723,14 @@ xsmp_handle_save_yourself(smc_conn, clie - - - /* - * Callback to warn us of imminent death. - */ --/*ARGSUSED*/ - static void - xsmp_die(smc_conn, client_data) -- SmcConn smc_conn; -- SmPointer client_data; -+ SmcConn smc_conn UNUSED; -+ SmPointer client_data UNUSED; - { - xsmp_close(); - - /* quit quickly leaving swapfiles for modified buffers behind */ - getout_preserve_modified(0); -@@ -6659,29 +6738,27 @@ xsmp_die(smc_conn, client_data) - - - /* - * Callback to tell us that save-yourself has completed. - */ --/*ARGSUSED*/ - static void - xsmp_save_complete(smc_conn, client_data) -- SmcConn smc_conn; -- SmPointer client_data; -+ SmcConn smc_conn UNUSED; -+ SmPointer client_data UNUSED; - { - xsmp.save_yourself = False; - } - - - /* - * Callback to tell us that an instigated shutdown was cancelled - * (maybe even by us) - */ --/*ARGSUSED*/ - static void - xsmp_shutdown_cancelled(smc_conn, client_data) - SmcConn smc_conn; -- SmPointer client_data; -+ SmPointer client_data UNUSED; - { - if (xsmp.save_yourself) - SmcSaveYourselfDone(smc_conn, True); - xsmp.save_yourself = False; - xsmp.shutdown = False; -@@ -6689,17 +6766,16 @@ xsmp_shutdown_cancelled(smc_conn, client - - - /* - * Callback to tell us that a new ICE connection has been established. - */ --/*ARGSUSED*/ - static void - xsmp_ice_connection(iceConn, clientData, opening, watchData) - IceConn iceConn; -- IcePointer clientData; -+ IcePointer clientData UNUSED; - Bool opening; -- IcePointer *watchData; -+ IcePointer *watchData UNUSED; - { - /* Intercept creation of ICE connection fd */ - if (opening) - { - xsmp_icefd = IceConnectionNumber(iceConn); -@@ -6812,11 +6888,12 @@ xsmp_init(void) - xsmp_close() - { - if (xsmp_icefd != -1) - { - SmcCloseConnection(xsmp.smcconn, 0, NULL); -- vim_free(xsmp.clientid); -+ if (xsmp.clientid != NULL) -+ free(xsmp.clientid); - xsmp.clientid = NULL; - xsmp_icefd = -1; - } - } - #endif /* USE_XSMP */ ---- vim72.orig/src/os_unix.h -+++ vim72/src/os_unix.h -@@ -122,11 +122,11 @@ - # define SIGPROTOARG (int, int, struct sigcontext *) - # define SIGDEFARG(s) (s, sig2, scont) int s, sig2; struct sigcontext *scont; - # define SIGDUMMYARG 0, 0, (struct sigcontext *)0 - # else - # define SIGPROTOARG (int) --# define SIGDEFARG(s) (s) int s; -+# define SIGDEFARG(s) (s) int s UNUSED; - # define SIGDUMMYARG 0 - # endif - #else - # define SIGPROTOARG (void) - # define SIGDEFARG(s) () -@@ -480,15 +480,10 @@ typedef struct dsc$descriptor DESC; - # ifdef HAVE_RENAME - # define mch_rename(src, dst) rename(src, dst) - # else - int mch_rename __ARGS((const char *src, const char *dest)); - # endif --# ifdef VMS --# define mch_chdir(s) chdir(vms_fixfilename(s)) --# else --# define mch_chdir(s) chdir(s) --# endif - # ifndef VMS - # ifdef __MVS__ - /* on OS390 Unix getenv() doesn't return a pointer to persistent - * storage -> use __getenv() */ - # define mch_getenv(x) (char_u *)__getenv((char *)(x)) ---- vim72.orig/src/os_unixx.h -+++ vim72/src/os_unixx.h -@@ -26,15 +26,10 @@ - - # if defined(HAVE_SYS_WAIT_H) || defined(HAVE_UNION_WAIT) - # include <sys/wait.h> - # endif - --# if defined(HAVE_SYS_SELECT_H) && \ -- (!defined(HAVE_SYS_TIME_H) || defined(SYS_SELECT_WITH_SYS_TIME)) --# include <sys/select.h> --# endif -- - # ifndef WEXITSTATUS - # ifdef HAVE_UNION_WAIT - # define WEXITSTATUS(stat_val) ((stat_val).w_T.w_Retcode) - # else - # define WEXITSTATUS(stat_val) (((stat_val) >> 8) & 0377) -@@ -63,20 +58,10 @@ - - #ifdef HAVE_STRING_H - # include <string.h> - #endif - --#ifndef HAVE_SELECT --# ifdef HAVE_SYS_POLL_H --# include <sys/poll.h> --# else --# ifdef HAVE_POLL_H --# include <poll.h> --# endif --# endif --#endif -- - #ifdef HAVE_SYS_STREAM_H - # include <sys/stream.h> - #endif - - #ifdef HAVE_SYS_UTSNAME_H ---- vim72.orig/src/os_vms.c -+++ vim72/src/os_vms.c -@@ -226,11 +226,11 @@ mch_getenv(char_u *lognam) - return(cp); - } - else if ((sbuf = getenv((char *)lognam))) - { - lengte = strlen(sbuf) + 1; -- cp = (char_u *)malloc((size_t)lengte); -+ cp = (char_u *)alloc((size_t)lengte); - if (cp) - strcpy((char *)cp, sbuf); - return cp; - } - else -@@ -379,11 +379,11 @@ vms_wproc(char *name, int val) - return 1; - } - if (--vms_match_free == 0) { - /* add more space to store matches */ - vms_match_alloced += EXPL_ALLOC_INC; -- vms_fmatch = (char_u **)realloc(vms_fmatch, -+ vms_fmatch = (char_u **)vim_realloc(vms_fmatch, - sizeof(char **) * vms_match_alloced); - if (!vms_fmatch) - return 0; - vms_match_free = EXPL_ALLOC_INC; - } -@@ -458,11 +458,11 @@ mch_expand_wildcards(int num_pat, char_u - - /* allocate memory for pointers */ - if (--files_free < 1) - { - files_alloced += EXPL_ALLOC_INC; -- *file = (char_u **)realloc(*file, -+ *file = (char_u **)vim_realloc(*file, - sizeof(char_u **) * files_alloced); - if (*file == NULL) - { - *file = (char_u **)""; - *num_file = 0; -@@ -612,18 +612,18 @@ vms_fixfilename(void *instring) - len = strlen(instring) + 1; - if (len > buflen) - { - buflen = len + 128; - if (buf) -- buf = (char *)realloc(buf, buflen); -+ buf = (char *)vim_realloc(buf, buflen); - else -- buf = (char *)calloc(buflen, sizeof(char)); -+ buf = (char *)alloc(buflen * sizeof(char)); - } - - #ifdef DEBUG - char *tmpbuf = NULL; -- tmpbuf = (char *)calloc(buflen, sizeof(char)); -+ tmpbuf = (char *)alloc(buflen * sizeof(char)); - strcpy(tmpbuf, instring); - #endif - - Fspec_Rms = buf; /* for decc$to_vms */ - ---- vim72.orig/src/os_vms_conf.h -+++ vim72/src/os_vms_conf.h -@@ -112,10 +112,12 @@ - #define HAVE_ERRNO_H - #define HAVE_OPENDIR - #define HAVE_PUTENV - #define HAVE_SETENV - #define HAVE_SETJMP_H -+#define HAVE_MATH_H -+#define HAVE_FLOAT_FUNCS - - #undef HAVE_DIRENT_H - #undef HAVE_SYS_NDIR_H - #undef HAVE_SYS_DIR_H - #undef HAVE_NDIR_H ---- vim72.orig/src/os_w32exe.c -+++ vim72/src/os_w32exe.c -@@ -127,11 +127,12 @@ WinMain( - #ifdef VIMDLL - FreeLibrary(hLib); - errout: - #endif - free(argv); -- free(tofree); -+ if (tofree != NULL) -+ free(tofree); - #ifdef FEAT_MBYTE - free_cmd_argsW(); - #endif - - return 0; ---- vim72.orig/src/os_win16.c -+++ vim72/src/os_win16.c -@@ -119,11 +119,12 @@ WinMain( - pmain = VimMain; - pSaveInst(hInstance); - pmain(argc, argv); - - free(argv); -- free(tofree); -+ if (tofree != NULL) -+ free(tofree); - - return 0; - } - #endif - ---- vim72.orig/src/os_win32.c -+++ vim72/src/os_win32.c -@@ -1585,11 +1585,11 @@ executable_exists(char *name) - char fname[_MAX_PATH]; - - #ifdef FEAT_MBYTE - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - { -- WCHAR *p = enc_to_ucs2(name, NULL); -+ WCHAR *p = enc_to_utf16(name, NULL); - WCHAR fnamew[_MAX_PATH]; - WCHAR *dumw; - long n; - - if (p != NULL) -@@ -2438,11 +2438,11 @@ mch_dirname( - { - WCHAR wbuf[_MAX_PATH + 1]; - - if (GetCurrentDirectoryW(_MAX_PATH, wbuf) != 0) - { -- char_u *p = ucs2_to_enc(wbuf, NULL); -+ char_u *p = utf16_to_enc(wbuf, NULL); - - if (p != NULL) - { - vim_strncpy(buf, p, len - 1); - vim_free(p); -@@ -2464,11 +2464,11 @@ mch_dirname( - mch_getperm(char_u *name) - { - #ifdef FEAT_MBYTE - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - { -- WCHAR *p = enc_to_ucs2(name, NULL); -+ WCHAR *p = enc_to_utf16(name, NULL); - long n; - - if (p != NULL) - { - n = (long)GetFileAttributesW(p); -@@ -2493,11 +2493,11 @@ mch_setperm( - { - perm |= FILE_ATTRIBUTE_ARCHIVE; /* file has changed, set archive bit */ - #ifdef FEAT_MBYTE - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - { -- WCHAR *p = enc_to_ucs2(name, NULL); -+ WCHAR *p = enc_to_utf16(name, NULL); - long n; - - if (p != NULL) - { - n = (long)SetFileAttributesW(p, perm); -@@ -2520,11 +2520,11 @@ mch_hide(char_u *name) - int perm; - #ifdef FEAT_MBYTE - WCHAR *p = NULL; - - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) -- p = enc_to_ucs2(name, NULL); -+ p = enc_to_utf16(name, NULL); - #endif - - #ifdef FEAT_MBYTE - if (p != NULL) - { -@@ -2588,11 +2588,11 @@ mch_is_linked(char_u *fname) - BY_HANDLE_FILE_INFORMATION inf; - #ifdef FEAT_MBYTE - WCHAR *wn = NULL; - - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) -- wn = enc_to_ucs2(fname, NULL); -+ wn = enc_to_utf16(fname, NULL); - if (wn != NULL) - { - hFile = CreateFileW(wn, /* file name */ - GENERIC_READ, /* access mode */ - 0, /* share mode */ -@@ -4237,11 +4237,11 @@ mch_remove(char_u *name) - WCHAR *wn = NULL; - int n; - - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - { -- wn = enc_to_ucs2(name, NULL); -+ wn = enc_to_utf16(name, NULL); - if (wn != NULL) - { - SetFileAttributesW(wn, FILE_ATTRIBUTE_NORMAL); - n = DeleteFileW(wn) ? 0 : -1; - vim_free(wn); -@@ -4380,12 +4380,12 @@ mch_rename( - WCHAR *wnew = NULL; - int retval = -1; - - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - { -- wold = enc_to_ucs2((char_u *)pszOldFile, NULL); -- wnew = enc_to_ucs2((char_u *)pszNewFile, NULL); -+ wold = enc_to_utf16((char_u *)pszOldFile, NULL); -+ wnew = enc_to_utf16((char_u *)pszNewFile, NULL); - if (wold != NULL && wnew != NULL) - retval = mch_wrename(wold, wnew); - vim_free(wold); - vim_free(wnew); - if (retval == 0 || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) -@@ -4490,11 +4490,11 @@ mch_access(char *n, int p) - int retval = -1; /* default: fail */ - #ifdef FEAT_MBYTE - WCHAR *wn = NULL; - - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) -- wn = enc_to_ucs2(n, NULL); -+ wn = enc_to_utf16(n, NULL); - #endif - - if (mch_isdir(n)) - { - char TempName[_MAX_PATH + 16] = ""; -@@ -4616,11 +4616,11 @@ getout: - return retval; - } - - #if defined(FEAT_MBYTE) || defined(PROTO) - /* -- * Version of open() that may use ucs2 file name. -+ * Version of open() that may use UTF-16 file name. - */ - int - mch_open(char *name, int flags, int mode) - { - /* _wopen() does not work with Borland C 5.5: creates a read-only file. */ -@@ -4628,11 +4628,11 @@ mch_open(char *name, int flags, int mode - WCHAR *wn; - int f; - - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - { -- wn = enc_to_ucs2(name, NULL); -+ wn = enc_to_utf16(name, NULL); - if (wn != NULL) - { - f = _wopen(wn, flags, mode); - vim_free(wn); - if (f >= 0) -@@ -4646,11 +4646,11 @@ mch_open(char *name, int flags, int mode - - return open(name, flags, mode); - } - - /* -- * Version of fopen() that may use ucs2 file name. -+ * Version of fopen() that may use UTF-16 file name. - */ - FILE * - mch_fopen(char *name, char *mode) - { - WCHAR *wn, *wm; -@@ -4673,12 +4673,12 @@ mch_fopen(char *name, char *mode) - if (newMode == 't') - _set_fmode(_O_TEXT); - else if (newMode == 'b') - _set_fmode(_O_BINARY); - # endif -- wn = enc_to_ucs2(name, NULL); -- wm = enc_to_ucs2(mode, NULL); -+ wn = enc_to_utf16(name, NULL); -+ wm = enc_to_utf16(mode, NULL); - if (wn != NULL && wm != NULL) - f = _wfopen(wn, wm); - vim_free(wn); - vim_free(wm); - -@@ -4774,12 +4774,12 @@ copy_infostreams(char_u *from, char_u *t - void *context = NULL; - DWORD lo, hi; - int len; - - /* Convert the file names to wide characters. */ -- fromw = enc_to_ucs2(from, NULL); -- tow = enc_to_ucs2(to, NULL); -+ fromw = enc_to_utf16(from, NULL); -+ tow = enc_to_utf16(to, NULL); - if (fromw != NULL && tow != NULL) - { - /* Open the file for reading. */ - sh = CreateFileW(fromw, GENERIC_READ, FILE_SHARE_READ, NULL, - OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); -@@ -5120,11 +5120,11 @@ fix_arg_enc(void) - return; /* out of memory */ - - for (i = 0; i < used_file_count; ++i) - { - idx = used_file_indexes[i]; -- str = ucs2_to_enc(ArglistW[idx], NULL); -+ str = utf16_to_enc(ArglistW[idx], NULL); - if (str != NULL) - { - #ifdef FEAT_DIFF - /* When using diff mode may need to concatenate file name to - * directory name. Just like it's done in main(). */ ---- vim72.orig/src/osdef1.h.in -+++ vim72/src/osdef1.h.in -@@ -23,11 +23,11 @@ extern int fclose __ARGS((FILE *)); - extern int fseek __ARGS((FILE *, long, int)); - #ifdef HAVE_FSEEKO - extern int fseeko __ARGS((FILE *, off_t, int)); - #endif - extern long ftell __ARGS((FILE *)); --#ifdef HAVE_FTELLO -+#ifdef HAVE_FSEEKO - extern off_t ftello __ARGS((FILE *)); - #endif - extern void rewind __ARGS((FILE *)); - extern int fread __ARGS((char *, int, int, FILE *)); - extern int fwrite __ARGS((char *, int, int, FILE *)); ---- vim72.orig/src/po/check.vim -+++ vim72/src/po/check.vim -@@ -21,10 +21,13 @@ func! GetMline() - endwhile - - " remove '%', not used for formatting. - let idline = substitute(idline, "'%'", '', 'g') - -+ " remove '%' used for plural forms. -+ let idline = substitute(idline, '\\nPlural-Forms: .\+;\\n', '', '') -+ - " remove everything but % items. - return substitute(idline, '[^%]*\(%[-+ #''.0-9*]*l\=[dsuxXpoc%]\)\=', '\1', 'g') - endfunc - - " Start at the first "msgid" line. ---- vim72.orig/src/popupmnu.c -+++ vim72/src/popupmnu.c -@@ -343,25 +343,40 @@ pum_redraw() - if (curwin->w_p_rl) - { - if (st != NULL) - { - char_u *rt = reverse_text(st); -- char_u *rt_saved = rt; -- int len, j; - - if (rt != NULL) - { -- len = (int)STRLEN(rt); -- if (len > pum_width) -+ char_u *rt_start = rt; -+ int size; -+ -+ size = vim_strsize(rt); -+ if (size > pum_width) - { -- for (j = pum_width; j < len; ++j) -+ do -+ { -+ size -= has_mbyte -+ ? (*mb_ptr2cells)(rt) : 1; - mb_ptr_adv(rt); -- len = pum_width; -+ } while (size > pum_width); -+ -+ if (size < pum_width) -+ { -+ /* Most left character requires -+ * 2-cells but only 1 cell is -+ * available on screen. Put a -+ * '<' on the left of the pum -+ * item */ -+ *(--rt) = '<'; -+ size++; -+ } - } -- screen_puts_len(rt, len, row, -- col - len + 1, attr); -- vim_free(rt_saved); -+ screen_puts_len(rt, (int)STRLEN(rt), -+ row, col - size + 1, attr); -+ vim_free(rt_start); - } - vim_free(st); - } - col -= width; - } -@@ -571,11 +586,11 @@ pum_set_selected(n, repeat) - } - else - { - /* Don't want to sync undo in the current buffer. */ - ++no_u_sync; -- res = do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, 0); -+ res = do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, 0, NULL); - --no_u_sync; - if (res == OK) - { - /* Edit a new, empty buffer. Set options for a "wipeout" - * buffer. */ -@@ -623,11 +638,11 @@ pum_set_selected(n, repeat) - } - } - - curbuf->b_changed = 0; - curbuf->b_p_ma = FALSE; -- curwin->w_cursor.lnum = 0; -+ curwin->w_cursor.lnum = 1; - curwin->w_cursor.col = 0; - - if (curwin != curwin_save && win_valid(curwin_save)) - { - /* Return cursor to where we were */ ---- vim72.orig/src/proto/buffer.pro -+++ vim72/src/proto/buffer.pro -@@ -31,33 +31,32 @@ void buf_set_name __ARGS((int fnum, char - void buf_name_changed __ARGS((buf_T *buf)); - buf_T *setaltfname __ARGS((char_u *ffname, char_u *sfname, linenr_T lnum)); - char_u *getaltfname __ARGS((int errmsg)); - int buflist_add __ARGS((char_u *fname, int flags)); - void buflist_slash_adjust __ARGS((void)); --void buflist_altfpos __ARGS((void)); -+void buflist_altfpos __ARGS((win_T *win)); - int otherfile __ARGS((char_u *ffname)); - void buf_setino __ARGS((buf_T *buf)); - void fileinfo __ARGS((int fullname, int shorthelp, int dont_truncate)); --void col_print __ARGS((char_u *buf, int col, int vcol)); -+void col_print __ARGS((char_u *buf, size_t buflen, int col, int vcol)); - void maketitle __ARGS((void)); - void resettitle __ARGS((void)); - void free_titles __ARGS((void)); - int build_stl_str_hl __ARGS((win_T *wp, char_u *out, size_t outlen, char_u *fmt, int use_sandbox, int fillchar, int maxwidth, struct stl_hlrec *hltab, struct stl_hlrec *tabtab)); --void get_rel_pos __ARGS((win_T *wp, char_u *str)); --int append_arg_number __ARGS((win_T *wp, char_u *buf, int add_file, int maxlen)); -+void get_rel_pos __ARGS((win_T *wp, char_u *buf, int buflen)); - char_u *fix_fname __ARGS((char_u *fname)); - void fname_expand __ARGS((buf_T *buf, char_u **ffname, char_u **sfname)); - char_u *alist_name __ARGS((aentry_T *aep)); - void do_arg_all __ARGS((int count, int forceit, int keep_tabs)); - void ex_buffer_all __ARGS((exarg_T *eap)); - void do_modelines __ARGS((int flags)); - int read_viminfo_bufferlist __ARGS((vir_T *virp, int writing)); - void write_viminfo_bufferlist __ARGS((FILE *fp)); - char *buf_spname __ARGS((buf_T *buf)); - void buf_addsign __ARGS((buf_T *buf, int id, linenr_T lnum, int typenr)); --int buf_change_sign_type __ARGS((buf_T *buf, int markId, int typenr)); --int_u buf_getsigntype __ARGS((buf_T *buf, linenr_T lnum, int type)); -+linenr_T buf_change_sign_type __ARGS((buf_T *buf, int markId, int typenr)); -+int buf_getsigntype __ARGS((buf_T *buf, linenr_T lnum, int type)); - linenr_T buf_delsign __ARGS((buf_T *buf, int id)); - int buf_findsign __ARGS((buf_T *buf, int id)); - int buf_findsign_id __ARGS((buf_T *buf, linenr_T lnum)); - int buf_findsigntype_id __ARGS((buf_T *buf, linenr_T lnum, int typenr)); - int buf_signcount __ARGS((buf_T *buf, linenr_T lnum)); ---- vim72.orig/src/proto/edit.pro -+++ vim72/src/proto/edit.pro -@@ -6,11 +6,11 @@ void display_dollar __ARGS((colnr_T col) - void change_indent __ARGS((int type, int amount, int round, int replaced, int call_changed_bytes)); - void truncate_spaces __ARGS((char_u *line)); - void backspace_until_column __ARGS((int col)); - int vim_is_ctrl_x_key __ARGS((int c)); - int ins_compl_add_infercase __ARGS((char_u *str, int len, int icase, char_u *fname, int dir, int flags)); --void set_completion __ARGS((int startcol, list_T *list)); -+void set_completion __ARGS((colnr_T startcol, list_T *list)); - void ins_compl_show_pum __ARGS((void)); - char_u *find_word_start __ARGS((char_u *ptr)); - char_u *find_word_end __ARGS((char_u *ptr)); - int ins_compl_active __ARGS((void)); - int ins_compl_add_tv __ARGS((typval_T *tv, int dir)); ---- vim72.orig/src/proto/eval.pro -+++ vim72/src/proto/eval.pro -@@ -15,11 +15,11 @@ int eval_printexpr __ARGS((char_u *fname - void eval_diff __ARGS((char_u *origfile, char_u *newfile, char_u *outfile)); - void eval_patch __ARGS((char_u *origfile, char_u *difffile, char_u *outfile)); - int eval_to_bool __ARGS((char_u *arg, int *error, char_u **nextcmd, int skip)); - char_u *eval_to_string_skip __ARGS((char_u *arg, char_u **nextcmd, int skip)); - int skip_expr __ARGS((char_u **pp)); --char_u *eval_to_string __ARGS((char_u *arg, char_u **nextcmd, int dolist)); -+char_u *eval_to_string __ARGS((char_u *arg, char_u **nextcmd, int convert)); - char_u *eval_to_string_safe __ARGS((char_u *arg, char_u **nextcmd, int use_sandbox)); - int eval_to_number __ARGS((char_u *expr)); - list_T *eval_spell_expr __ARGS((char_u *badword, char_u *expr)); - int get_spellword __ARGS((list_T *list, char_u **pp)); - typval_T *eval_expr __ARGS((char_u *arg, char_u **nextcmd)); -@@ -44,24 +44,33 @@ void del_menutrans_vars __ARGS((void)); - char_u *get_user_var_name __ARGS((expand_T *xp, int idx)); - list_T *list_alloc __ARGS((void)); - void list_unref __ARGS((list_T *l)); - void list_free __ARGS((list_T *l, int recurse)); - dictitem_T *dict_lookup __ARGS((hashitem_T *hi)); -+char_u *list_find_str __ARGS((list_T *l, long idx)); -+int list_append_tv __ARGS((list_T *l, typval_T *tv)); - int list_append_dict __ARGS((list_T *list, dict_T *dict)); -+int list_append_string __ARGS((list_T *l, char_u *str, int len)); - int garbage_collect __ARGS((void)); - dict_T *dict_alloc __ARGS((void)); -+dictitem_T *dictitem_alloc __ARGS((char_u *key)); -+void dictitem_free __ARGS((dictitem_T *item)); -+int dict_add __ARGS((dict_T *d, dictitem_T *item)); - int dict_add_nr_str __ARGS((dict_T *d, char *key, long nr, char_u *str)); - char_u *get_dict_string __ARGS((dict_T *d, char_u *key, int save)); - long get_dict_number __ARGS((dict_T *d, char_u *key)); - char_u *get_function_name __ARGS((expand_T *xp, int idx)); - char_u *get_expr_name __ARGS((expand_T *xp, int idx)); - long do_searchpair __ARGS((char_u *spat, char_u *mpat, char_u *epat, int dir, char_u *skip, int flags, pos_T *match_pos, linenr_T lnum_stop, long time_limit)); - void set_vim_var_nr __ARGS((int idx, long val)); - long get_vim_var_nr __ARGS((int idx)); - char_u *get_vim_var_str __ARGS((int idx)); --void set_vcount __ARGS((long count, long count1)); -+list_T *get_vim_var_list __ARGS((int idx)); -+void set_vim_var_char __ARGS((int c)); -+void set_vcount __ARGS((long count, long count1, int set_prevcount)); - void set_vim_var_string __ARGS((int idx, char_u *val, int len)); -+void set_vim_var_list __ARGS((int idx, list_T *val)); - void set_reg_var __ARGS((int c)); - char_u *v_exception __ARGS((char_u *oldval)); - char_u *v_throwpoint __ARGS((char_u *oldval)); - char_u *set_cmdarg __ARGS((exarg_T *eap, char_u *oldarg)); - void free_tv __ARGS((typval_T *varp)); -@@ -70,10 +79,11 @@ long get_tv_number_chk __ARGS((typval_T - char_u *get_tv_string_chk __ARGS((typval_T *varp)); - char_u *get_var_value __ARGS((char_u *name)); - void new_script_vars __ARGS((scid_T id)); - void init_var_dict __ARGS((dict_T *dict, dictitem_T *dict_var)); - void vars_clear __ARGS((hashtab_T *ht)); -+void copy_tv __ARGS((typval_T *from, typval_T *to)); - void ex_echo __ARGS((exarg_T *eap)); - void ex_echohl __ARGS((exarg_T *eap)); - void ex_execute __ARGS((exarg_T *eap)); - void ex_function __ARGS((exarg_T *eap)); - void free_all_functions __ARGS((void)); -@@ -92,8 +102,9 @@ int func_has_ended __ARGS((void *cookie) - int func_has_abort __ARGS((void *cookie)); - int read_viminfo_varlist __ARGS((vir_T *virp, int writing)); - void write_viminfo_varlist __ARGS((FILE *fp)); - int store_session_globals __ARGS((FILE *fd)); - void last_set_msg __ARGS((scid_T scriptID)); -+void ex_oldfiles __ARGS((exarg_T *eap)); - int modify_fname __ARGS((char_u *src, int *usedlen, char_u **fnamep, char_u **bufp, int *fnamelen)); - char_u *do_string_sub __ARGS((char_u *str, char_u *pat, char_u *sub, char_u *flags)); - /* vim: set ft=c : */ ---- vim72.orig/src/proto/ex_cmds.pro -+++ vim72/src/proto/ex_cmds.pro -@@ -7,13 +7,13 @@ int do_move __ARGS((linenr_T line1, line - void ex_copy __ARGS((linenr_T line1, linenr_T line2, linenr_T n)); - void free_prev_shellcmd __ARGS((void)); - void do_bang __ARGS((int addr_count, exarg_T *eap, int forceit, int do_in, int do_out)); - void do_shell __ARGS((char_u *cmd, int flags)); - char_u *make_filter_cmd __ARGS((char_u *cmd, char_u *itmp, char_u *otmp)); --void append_redir __ARGS((char_u *buf, char_u *opt, char_u *fname)); -+void append_redir __ARGS((char_u *buf, int buflen, char_u *opt, char_u *fname)); - int viminfo_error __ARGS((char *errnum, char *message, char_u *line)); --int read_viminfo __ARGS((char_u *file, int want_info, int want_marks, int forceit)); -+int read_viminfo __ARGS((char_u *file, int flags)); - void write_viminfo __ARGS((char_u *file, int forceit)); - int viminfo_readline __ARGS((vir_T *virp)); - char_u *viminfo_readstring __ARGS((vir_T *virp, int off, int convert)); - void viminfo_writestring __ARGS((FILE *fd, char_u *p)); - void do_fixdel __ARGS((exarg_T *eap)); -@@ -25,11 +25,11 @@ void ex_write __ARGS((exarg_T *eap)); - int do_write __ARGS((exarg_T *eap)); - void ex_wnext __ARGS((exarg_T *eap)); - void do_wqall __ARGS((exarg_T *eap)); - int not_writing __ARGS((void)); - int getfile __ARGS((int fnum, char_u *ffname, char_u *sfname, int setpm, linenr_T lnum, int forceit)); --int do_ecmd __ARGS((int fnum, char_u *ffname, char_u *sfname, exarg_T *eap, linenr_T newlnum, int flags)); -+int do_ecmd __ARGS((int fnum, char_u *ffname, char_u *sfname, exarg_T *eap, linenr_T newlnum, int flags, win_T *oldwin)); - void ex_append __ARGS((exarg_T *eap)); - void ex_change __ARGS((exarg_T *eap)); - void ex_z __ARGS((exarg_T *eap)); - int check_restricted __ARGS((void)); - int check_secure __ARGS((void)); -@@ -53,7 +53,10 @@ void ex_sign __ARGS((exarg_T *eap)); - void sign_gui_started __ARGS((void)); - int sign_get_attr __ARGS((int typenr, int line)); - char_u *sign_get_text __ARGS((int typenr)); - void *sign_get_image __ARGS((int typenr)); - char_u *sign_typenr2name __ARGS((int typenr)); -+void free_signs __ARGS((void)); -+char_u *get_sign_name __ARGS((expand_T *xp, int idx)); -+void set_context_in_sign_cmd __ARGS((expand_T *xp, char_u *arg)); - void ex_drop __ARGS((exarg_T *eap)); - /* vim: set ft=c : */ ---- vim72.orig/src/proto/ex_cmds2.pro -+++ vim72/src/proto/ex_cmds2.pro -@@ -22,10 +22,12 @@ void profile_self __ARGS((proftime_T *se - void profile_get_wait __ARGS((proftime_T *tm)); - void profile_sub_wait __ARGS((proftime_T *tm, proftime_T *tma)); - int profile_equal __ARGS((proftime_T *tm1, proftime_T *tm2)); - int profile_cmp __ARGS((proftime_T *tm1, proftime_T *tm2)); - void ex_profile __ARGS((exarg_T *eap)); -+char_u *get_profile_name __ARGS((expand_T *xp, int idx)); -+void set_context_in_profile_cmd __ARGS((expand_T *xp, char_u *arg)); - void profile_dump __ARGS((void)); - void script_prof_save __ARGS((proftime_T *tm)); - void script_prof_restore __ARGS((proftime_T *tm)); - void prof_inchar_enter __ARGS((void)); - void prof_inchar_exit __ARGS((void)); ---- vim72.orig/src/proto/ex_docmd.pro -+++ vim72/src/proto/ex_docmd.pro -@@ -50,6 +50,7 @@ int find_cmdline_var __ARGS((char_u *src - char_u *eval_vars __ARGS((char_u *src, char_u *srcstart, int *usedlen, linenr_T *lnump, char_u **errormsg, int *escaped)); - char_u *expand_sfile __ARGS((char_u *arg)); - int put_eol __ARGS((FILE *fd)); - int put_line __ARGS((FILE *fd, char *s)); - void dialog_msg __ARGS((char_u *buff, char *format, char_u *fname)); -+char_u *get_behave_arg __ARGS((expand_T *xp, int idx)); - /* vim: set ft=c : */ ---- vim72.orig/src/proto/ex_getln.pro -+++ vim72/src/proto/ex_getln.pro -@@ -2,10 +2,11 @@ - char_u *getcmdline __ARGS((int firstc, long count, int indent)); - char_u *getcmdline_prompt __ARGS((int firstc, char_u *prompt, int attr, int xp_context, char_u *xp_arg)); - int text_locked __ARGS((void)); - void text_locked_msg __ARGS((void)); - int curbuf_locked __ARGS((void)); -+int allbuf_locked __ARGS((void)); - char_u *getexline __ARGS((int c, void *dummy, int indent)); - char_u *getexmodeline __ARGS((int promptc, void *dummy, int indent)); - int cmdline_overstrike __ARGS((void)); - int cmdline_at_end __ARGS((void)); - colnr_T cmdline_getvcol_cursor __ARGS((void)); -@@ -29,11 +30,11 @@ void tilde_replace __ARGS((char_u *orig_ - char_u *sm_gettail __ARGS((char_u *s)); - char_u *addstar __ARGS((char_u *fname, int len, int context)); - void set_cmd_context __ARGS((expand_T *xp, char_u *str, int len, int col)); - int expand_cmdline __ARGS((expand_T *xp, char_u *str, int col, int *matchcount, char_u ***matches)); - int ExpandGeneric __ARGS((expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file, char_u *((*func)(expand_T *, int)))); --char_u *globpath __ARGS((char_u *path, char_u *file)); -+char_u *globpath __ARGS((char_u *path, char_u *file, int expand_options)); - void init_history __ARGS((void)); - int get_histtype __ARGS((char_u *name)); - void add_to_history __ARGS((int histype, char_u *new_entry, int in_map, int sep)); - int get_history_idx __ARGS((int histype)); - char_u *get_cmdline_str __ARGS((void)); ---- vim72.orig/src/proto/gui.pro -+++ vim72/src/proto/gui.pro -@@ -41,10 +41,11 @@ int send_tabline_event __ARGS((int nr)); - void send_tabline_menu_event __ARGS((int tabidx, int event)); - void gui_remove_scrollbars __ARGS((void)); - void gui_create_scrollbar __ARGS((scrollbar_T *sb, int type, win_T *wp)); - scrollbar_T *gui_find_scrollbar __ARGS((long ident)); - void gui_drag_scrollbar __ARGS((scrollbar_T *sb, long value, int still_dragging)); -+void gui_may_update_scrollbars __ARGS((void)); - void gui_update_scrollbars __ARGS((int force)); - int gui_do_scroll __ARGS((void)); - int gui_do_horiz_scroll __ARGS((void)); - void gui_check_colors __ARGS((void)); - guicolor_T gui_get_color __ARGS((char_u *name)); ---- vim72.orig/src/proto/gui_gtk_x11.pro -+++ vim72/src/proto/gui_gtk_x11.pro -@@ -14,10 +14,12 @@ void gui_mch_forked __ARGS((void)); - void gui_mch_new_colors __ARGS((void)); - int gui_mch_open __ARGS((void)); - void gui_mch_exit __ARGS((int rc)); - int gui_mch_get_winpos __ARGS((int *x, int *y)); - void gui_mch_set_winpos __ARGS((int x, int y)); -+int gui_mch_maximized __ARGS((void)); -+void gui_mch_unmaximize __ARGS((void)); - void gui_mch_set_shellsize __ARGS((int width, int height, int min_width, int min_height, int base_width, int base_height, int direction)); - void gui_mch_get_screen_dimensions __ARGS((int *screen_w, int *screen_h)); - void gui_mch_settitle __ARGS((char_u *title, char_u *icon)); - void gui_mch_enable_menu __ARGS((int showit)); - void gui_mch_show_toolbar __ARGS((int showit)); ---- vim72.orig/src/proto/if_cscope.pro -+++ vim72/src/proto/if_cscope.pro -@@ -1,6 +1,8 @@ - /* if_cscope.c */ -+char_u *get_cscope_name __ARGS((expand_T *xp, int idx)); -+void set_context_in_cscope_cmd __ARGS((expand_T *xp, char_u *arg, cmdidx_T cmdidx)); - void do_cscope __ARGS((exarg_T *eap)); - void do_scscope __ARGS((exarg_T *eap)); - void do_cstag __ARGS((exarg_T *eap)); - int cs_fgets __ARGS((char_u *buf, int size)); - void cs_free_tags __ARGS((void)); ---- vim72.orig/src/proto/if_mzsch.pro -+++ vim72/src/proto/if_mzsch.pro -@@ -11,14 +11,9 @@ void raise_if_error __ARGS((void)); - buf_T *get_valid_buffer __ARGS((void *)); - win_T *get_valid_window __ARGS((void *)); - void mzvim_check_threads __ARGS((void)); - void mzvim_reset_timer __ARGS((void)); - void *mzvim_eval_string __ARGS((char_u *str)); --struct Scheme_Object *mzvim_apply __ARGS((struct Scheme_Object *, int argc, -- struct Scheme_Object **)); --int mzthreads_allowed (void); --#ifdef FEAT_GUI_KDE --void timer_proc (void); --void mzscheme_kde_start_timer (void); --void mzscheme_kde_stop_timer (void); --#endif -+int mzthreads_allowed __ARGS((void)); -+void mzscheme_main __ARGS((void)); -+void do_mzeval __ARGS((char_u *str, typval_T *rettv)); - /* vim: set ft=c : */ ---- vim72.orig/src/proto/mark.pro -+++ vim72/src/proto/mark.pro -@@ -24,7 +24,7 @@ void set_last_cursor __ARGS((win_T *win) - void free_all_marks __ARGS((void)); - int read_viminfo_filemark __ARGS((vir_T *virp, int force)); - void write_viminfo_filemarks __ARGS((FILE *fp)); - int removable __ARGS((char_u *name)); - int write_viminfo_marks __ARGS((FILE *fp_out)); --void copy_viminfo_marks __ARGS((vir_T *virp, FILE *fp_out, int count, int eof)); -+void copy_viminfo_marks __ARGS((vir_T *virp, FILE *fp_out, int count, int eof, int flags)); - /* vim: set ft=c : */ ---- vim72.orig/src/proto/mbyte.pro -+++ vim72/src/proto/mbyte.pro -@@ -5,14 +5,16 @@ int bomb_size __ARGS((void)); - int mb_get_class __ARGS((char_u *p)); - int dbcs_class __ARGS((unsigned lead, unsigned trail)); - int latin_char2len __ARGS((int c)); - int latin_char2bytes __ARGS((int c, char_u *buf)); - int latin_ptr2len __ARGS((char_u *p)); -+int latin_ptr2len_len __ARGS((char_u *p, int size)); - int utf_char2cells __ARGS((int c)); - int latin_ptr2cells __ARGS((char_u *p)); - int utf_ptr2cells __ARGS((char_u *p)); - int dbcs_ptr2cells __ARGS((char_u *p)); -+int latin_ptr2cells_len __ARGS((char_u *p, int size)); - int latin_char2cells __ARGS((int c)); - int latin_off2cells __ARGS((unsigned off, unsigned max_off)); - int dbcs_off2cells __ARGS((unsigned off, unsigned max_off)); - int utf_off2cells __ARGS((unsigned off, unsigned max_off)); - int latin_ptr2char __ARGS((char_u *p)); -@@ -83,10 +85,11 @@ void im_shutdown __ARGS((void)); - int xim_get_status_area_height __ARGS((void)); - int im_get_status __ARGS((void)); - int preedit_get_status __ARGS((void)); - int im_is_preediting __ARGS((void)); - int convert_setup __ARGS((vimconv_T *vcp, char_u *from, char_u *to)); -+int convert_setup_ext __ARGS((vimconv_T *vcp, char_u *from, int from_unicode_is_utf8, char_u *to, int to_unicode_is_utf8)); - int convert_input __ARGS((char_u *ptr, int len, int maxlen)); - int convert_input_safe __ARGS((char_u *ptr, int len, int maxlen, char_u **restp, int *restlenp)); - char_u *string_convert __ARGS((vimconv_T *vcp, char_u *ptr, int *lenp)); - char_u *string_convert_ext __ARGS((vimconv_T *vcp, char_u *ptr, int *lenp, int *unconvlenp)); - /* vim: set ft=c : */ ---- vim72.orig/src/proto/message.pro -+++ vim72/src/proto/message.pro -@@ -52,10 +52,11 @@ void repeat_message __ARGS((void)); - void msg_clr_eos __ARGS((void)); - void msg_clr_eos_force __ARGS((void)); - void msg_clr_cmdline __ARGS((void)); - int msg_end __ARGS((void)); - void msg_check __ARGS((void)); -+int redirecting __ARGS((void)); - void verbose_enter __ARGS((void)); - void verbose_leave __ARGS((void)); - void verbose_enter_scroll __ARGS((void)); - void verbose_leave_scroll __ARGS((void)); - void verbose_stop __ARGS((void)); ---- vim72.orig/src/proto/misc1.pro -+++ vim72/src/proto/misc1.pro -@@ -83,10 +83,11 @@ int get_lisp_indent __ARGS((void)); - void prepare_to_exit __ARGS((void)); - void preserve_exit __ARGS((void)); - int vim_fexists __ARGS((char_u *fname)); - void line_breakcheck __ARGS((void)); - void fast_breakcheck __ARGS((void)); -+int expand_wildcards_eval __ARGS((char_u **pat, int *num_file, char_u ***file, int flags)); - int expand_wildcards __ARGS((int num_pat, char_u **pat, int *num_file, char_u ***file, int flags)); - int match_suffix __ARGS((char_u *fname)); - int unix_expandpath __ARGS((garray_T *gap, char_u *path, int wildoff, int flags, int didstar)); - int gen_expand_wildcards __ARGS((int num_pat, char_u **pat, int *num_file, char_u ***file, int flags)); - void addfile __ARGS((garray_T *gap, char_u *f, int flags)); ---- vim72.orig/src/proto/misc2.pro -+++ vim72/src/proto/misc2.pro -@@ -57,11 +57,11 @@ void ga_append __ARGS((garray_T *gap, in - int name_to_mod_mask __ARGS((int c)); - int simplify_key __ARGS((int key, int *modifiers)); - int handle_x_keys __ARGS((int key)); - char_u *get_special_key_name __ARGS((int c, int modifiers)); - int trans_special __ARGS((char_u **srcp, char_u *dst, int keycode)); --int find_special_key __ARGS((char_u **srcp, int *modp, int keycode)); -+int find_special_key __ARGS((char_u **srcp, int *modp, int keycode, int keep_x_key)); - int extract_modifiers __ARGS((int key, int *modp)); - int find_special_key_in_table __ARGS((int c)); - int get_special_key_code __ARGS((char_u *name)); - char_u *get_key_name __ARGS((int i)); - int get_mouse_button __ARGS((int code, int *is_click, int *is_drag)); ---- vim72.orig/src/proto/netbeans.pro -+++ vim72/src/proto/netbeans.pro -@@ -9,16 +9,16 @@ void netbeans_beval_cb __ARGS((BalloonEv - void netbeans_startup_done __ARGS((void)); - void netbeans_send_disconnect __ARGS((void)); - void netbeans_frame_moved __ARGS((int new_x, int new_y)); - void netbeans_file_activated __ARGS((buf_T *bufp)); - void netbeans_file_opened __ARGS((buf_T *bufp)); --void netbeans_file_closed __ARGS((buf_T *bufp)); -+void netbeans_file_killed __ARGS((buf_T *bufp)); - void netbeans_inserted __ARGS((buf_T *bufp, linenr_T linenr, colnr_T col, char_u *txt, int newlen)); - void netbeans_removed __ARGS((buf_T *bufp, linenr_T linenr, colnr_T col, long len)); - void netbeans_unmodified __ARGS((buf_T *bufp)); - void netbeans_button_release __ARGS((int button)); --void netbeans_keycommand __ARGS((int key)); -+int netbeans_keycommand __ARGS((int key)); - void netbeans_save_buffer __ARGS((buf_T *bufp)); - void netbeans_deleted_all_lines __ARGS((buf_T *bufp)); - int netbeans_is_guarded __ARGS((linenr_T top, linenr_T bot)); - void netbeans_draw_multisign_indicator __ARGS((int row)); - void netbeans_draw_multisign_indicator __ARGS((int row)); ---- vim72.orig/src/proto/option.pro -+++ vim72/src/proto/option.pro -@@ -27,10 +27,11 @@ char_u *get_highlight_default __ARGS((vo - char_u *get_encoding_default __ARGS((void)); - int makeset __ARGS((FILE *fd, int opt_flags, int local_only)); - int makefoldset __ARGS((FILE *fd)); - void clear_termoptions __ARGS((void)); - void free_termoptions __ARGS((void)); -+void free_one_termoption __ARGS((char_u *var)); - void set_term_defaults __ARGS((void)); - void comp_col __ARGS((void)); - char_u *get_equalprg __ARGS((void)); - void win_copy_options __ARGS((win_T *wp_from, win_T *wp_to)); - void copy_winopt __ARGS((winopt_T *from, winopt_T *to)); -@@ -42,10 +43,11 @@ void reset_modifiable __ARGS((void)); - void set_iminsert_global __ARGS((void)); - void set_imsearch_global __ARGS((void)); - void set_context_in_set_cmd __ARGS((expand_T *xp, char_u *arg, int opt_flags)); - int ExpandSettings __ARGS((expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file)); - int ExpandOldSetting __ARGS((int *num_file, char_u ***file)); -+int langmap_adjust_mb __ARGS((int c)); - int has_format_option __ARGS((int x)); - int shortmess __ARGS((int x)); - void vimrc_found __ARGS((char_u *fname, char_u *envname)); - void change_compatible __ARGS((int on)); - int option_was_set __ARGS((char_u *name)); ---- vim72.orig/src/proto/os_mswin.pro -+++ vim72/src/proto/os_mswin.pro -@@ -20,18 +20,18 @@ int mch_has_exp_wildcard __ARGS((char_u - int mch_has_wildcard __ARGS((char_u *p)); - int mch_chdir __ARGS((char *path)); - int can_end_termcap_mode __ARGS((int give_msg)); - int mch_screenmode __ARGS((char_u *arg)); - int mch_libcall __ARGS((char_u *libname, char_u *funcname, char_u *argstring, int argint, char_u **string_result, int *number_result)); --int utf8_to_ucs2 __ARGS((char_u *instr, int inlen, short_u *outstr, int *unconvlenp)); --int ucs2_to_utf8 __ARGS((short_u *instr, int inlen, char_u *outstr)); -+int utf8_to_utf16 __ARGS((char_u *instr, int inlen, short_u *outstr, int *unconvlenp)); -+int utf16_to_utf8 __ARGS((short_u *instr, int inlen, char_u *outstr)); - void MultiByteToWideChar_alloc __ARGS((UINT cp, DWORD flags, LPCSTR in, int inlen, LPWSTR *out, int *outlen)); - void WideCharToMultiByte_alloc __ARGS((UINT cp, DWORD flags, LPCWSTR in, int inlen, LPSTR *out, int *outlen, LPCSTR def, LPBOOL useddef)); - int clip_mch_own_selection __ARGS((VimClipboard *cbd)); - void clip_mch_lose_selection __ARGS((VimClipboard *cbd)); --short_u *enc_to_ucs2 __ARGS((char_u *str, int *lenp)); --char_u *ucs2_to_enc __ARGS((short_u *str, int *lenp)); -+short_u *enc_to_utf16 __ARGS((char_u *str, int *lenp)); -+char_u *utf16_to_enc __ARGS((short_u *str, int *lenp)); - void clip_mch_request_selection __ARGS((VimClipboard *cbd)); - void acp_to_enc __ARGS((char_u *str, int str_size, char_u **out, int *outlen)); - void clip_mch_set_selection __ARGS((VimClipboard *cbd)); - void DumpPutS __ARGS((const char *psz)); - int mch_get_winpos __ARGS((int *x, int *y)); ---- vim72.orig/src/proto/os_unix.pro -+++ vim72/src/proto/os_unix.pro -@@ -1,6 +1,7 @@ - /* os_unix.c */ -+int mch_chdir __ARGS((char *path)); - void mch_write __ARGS((char_u *s, int len)); - int mch_inchar __ARGS((char_u *buf, int maxlen, long wtime, int tb_change_cnt)); - int mch_char_avail __ARGS((void)); - long_u mch_total_mem __ARGS((int special)); - void mch_delay __ARGS((long msec, int ignoreinput)); ---- vim72.orig/src/proto/spell.pro -+++ vim72/src/proto/spell.pro -@@ -20,7 +20,7 @@ void ex_spellinfo __ARGS((exarg_T *eap)) - void ex_spelldump __ARGS((exarg_T *eap)); - void spell_dump_compl __ARGS((buf_T *buf, char_u *pat, int ic, int *dir, int dumpflags_arg)); - char_u *spell_to_word_end __ARGS((char_u *start, buf_T *buf)); - int spell_word_start __ARGS((int startcol)); - void spell_expand_check_cap __ARGS((colnr_T col)); --int expand_spelling __ARGS((linenr_T lnum, int col, char_u *pat, char_u ***matchp)); -+int expand_spelling __ARGS((linenr_T lnum, char_u *pat, char_u ***matchp)); - /* vim: set ft=c : */ ---- vim72.orig/src/proto/ui.pro -+++ vim72/src/proto/ui.pro -@@ -46,10 +46,11 @@ void ui_cursor_shape __ARGS((void)); - int check_col __ARGS((int col)); - int check_row __ARGS((int row)); - void open_app_context __ARGS((void)); - void x11_setup_atoms __ARGS((Display *dpy)); - void clip_x11_request_selection __ARGS((Widget myShell, Display *dpy, VimClipboard *cbd)); -+void yank_cut_buffer0 __ARGS((Display *dpy, VimClipboard *cbd)); - void clip_x11_lose_selection __ARGS((Widget myShell, VimClipboard *cbd)); - int clip_x11_own_selection __ARGS((Widget myShell, VimClipboard *cbd)); - void clip_x11_set_selection __ARGS((VimClipboard *cbd)); - int jump_to_mouse __ARGS((int flags, int *inclusive, int which_button)); - int mouse_comp_pos __ARGS((win_T *win, int *rowp, int *colp, linenr_T *lnump)); ---- vim72.orig/src/proto/window.pro -+++ vim72/src/proto/window.pro -@@ -1,20 +1,24 @@ - /* window.c */ - void do_window __ARGS((int nchar, long Prenum, int xchar)); - int win_split __ARGS((int size, int flags)); -+int win_split_ins __ARGS((int size, int flags, win_T *newwin, int dir)); - int win_valid __ARGS((win_T *win)); - int win_count __ARGS((void)); - int make_windows __ARGS((int count, int vertical)); - void win_move_after __ARGS((win_T *win1, win_T *win2)); - void win_equal __ARGS((win_T *next_curwin, int current, int dir)); - void close_windows __ARGS((buf_T *buf, int keep_curwin)); - void win_close __ARGS((win_T *win, int free_buf)); - void win_close_othertab __ARGS((win_T *win, int free_buf, tabpage_T *tp)); - void win_free_all __ARGS((void)); -+win_T *winframe_remove __ARGS((win_T *win, int *dirp, tabpage_T *tp)); - void close_others __ARGS((int message, int forceit)); - void curwin_init __ARGS((void)); -+void win_init_empty __ARGS((win_T *wp)); - int win_alloc_first __ARGS((void)); -+void win_alloc_aucmd_win __ARGS((void)); - void win_init_size __ARGS((void)); - void free_tabpage __ARGS((tabpage_T *tp)); - int win_new_tabpage __ARGS((int after)); - int may_open_tabpage __ARGS((void)); - int make_tabpages __ARGS((int maxcount)); -@@ -28,10 +32,12 @@ void tabpage_move __ARGS((int nr)); - void win_goto __ARGS((win_T *wp)); - win_T *win_find_nr __ARGS((int winnr)); - void win_enter __ARGS((win_T *wp, int undo_sync)); - win_T *buf_jump_open_win __ARGS((buf_T *buf)); - win_T *buf_jump_open_tab __ARGS((buf_T *buf)); -+void win_append __ARGS((win_T *after, win_T *wp)); -+void win_remove __ARGS((win_T *wp, tabpage_T *tp)); - int win_alloc_lines __ARGS((win_T *wp)); - void win_free_lsize __ARGS((win_T *wp)); - void shell_new_rows __ARGS((void)); - void shell_new_columns __ARGS((void)); - void win_size_save __ARGS((garray_T *gap)); -@@ -56,10 +62,12 @@ int path_with_url __ARGS((char_u *fname) - int vim_isAbsName __ARGS((char_u *name)); - int vim_FullName __ARGS((char_u *fname, char_u *buf, int len, int force)); - int min_rows __ARGS((void)); - int only_one_window __ARGS((void)); - void check_lnums __ARGS((int do_curwin)); -+void make_snapshot __ARGS((int idx)); -+void restore_snapshot __ARGS((int idx, int close_curwin)); - int win_hasvertsplit __ARGS((void)); - int match_add __ARGS((win_T *wp, char_u *grp, char_u *pat, int prio, int id)); - int match_delete __ARGS((win_T *wp, int id, int perr)); - void clear_matches __ARGS((win_T *wp)); - matchitem_T *get_match __ARGS((win_T *wp, int id)); ---- vim72.orig/src/pty.c -+++ vim72/src/pty.c -@@ -268,13 +268,14 @@ OpenPTY(ttyn) - *ttyn = TtyName; - return f; - } - #endif - --#if defined(HAVE_SVR4_PTYS) && !defined(PTY_DONE) && !defined(hpux) -+#if defined(HAVE_SVR4_PTYS) && !defined(PTY_DONE) && !defined(hpux) && !defined(MACOS_X) - --/* NOTE: Even though HPUX can have /dev/ptmx, the code below doesn't work! */ -+/* NOTE: Even though HPUX can have /dev/ptmx, the code below doesn't work! -+ * Same for Mac OS X Leopard. */ - #define PTY_DONE - int - OpenPTY(ttyn) - char **ttyn; - { ---- vim72.orig/src/quickfix.c -+++ vim72/src/quickfix.c -@@ -1417,11 +1417,13 @@ qf_jump(qi, dir, errornr, forceit) - char_u *old_swb = p_swb; - unsigned old_swb_flags = swb_flags; - int opened_window = FALSE; - win_T *win; - win_T *altwin; -+ int flags; - #endif -+ win_T *oldwin = curwin; - int print_message = TRUE; - int len; - #ifdef FEAT_FOLDING - int old_KeyTyped = KeyTyped; /* getting file may reset it */ - #endif -@@ -1528,11 +1530,10 @@ qf_jump(qi, dir, errornr, forceit) - * For ":helpgrep" find a help window or open one. - */ - if (qf_ptr->qf_type == 1 && (!curwin->w_buffer->b_help || cmdmod.tab != 0)) - { - win_T *wp; -- int n; - - if (cmdmod.tab != 0) - wp = NULL; - else - for (wp = firstwin; wp != NULL; wp = wp->w_next) -@@ -1544,27 +1545,29 @@ qf_jump(qi, dir, errornr, forceit) - { - /* - * Split off help window; put it at far top if no position - * specified, the current window is vertically split and narrow. - */ -- n = WSP_HELP; -+ flags = WSP_HELP; - # ifdef FEAT_VERTSPLIT - if (cmdmod.split == 0 && curwin->w_width != Columns - && curwin->w_width < 80) -- n |= WSP_TOP; -+ flags |= WSP_TOP; - # endif -- if (win_split(0, n) == FAIL) -+ if (qi != &ql_info) -+ flags |= WSP_NEWLOC; /* don't copy the location list */ -+ -+ if (win_split(0, flags) == FAIL) - goto theend; - opened_window = TRUE; /* close it when fail */ - - if (curwin->w_height < p_hh) - win_setheight((int)p_hh); - - if (qi != &ql_info) /* not a quickfix list */ - { - /* The new window should use the supplied location list */ -- qf_free_all(curwin); - curwin->w_llist = qi; - qi->qf_refcount++; - } - } - -@@ -1607,24 +1610,28 @@ qf_jump(qi, dir, errornr, forceit) - { - if (wp->w_buffer->b_fnum == qf_ptr->qf_fnum) - { - goto_tabpage_win(tp, wp); - usable_win = 1; -- break; -+ goto win_found; - } - } - } -+win_found: - - /* - * If there is only one window and it is the quickfix window, create a - * new one above the quickfix window. - */ - if (((firstwin == lastwin) && bt_quickfix(curbuf)) || !usable_win) - { - ll_ref = curwin->w_llist_ref; - -- if (win_split(0, WSP_ABOVE) == FAIL) -+ flags = WSP_ABOVE; -+ if (ll_ref != NULL) -+ flags |= WSP_NEWLOC; -+ if (win_split(0, flags) == FAIL) - goto failed; /* not enough room for window */ - opened_window = TRUE; /* close it when fail */ - p_swb = empty_option; /* don't split again */ - swb_flags = 0; - # ifdef FEAT_SCROLLBIND -@@ -1632,11 +1639,10 @@ qf_jump(qi, dir, errornr, forceit) - # endif - if (ll_ref != NULL) - { - /* The new window should use the location list from the - * location list window */ -- qf_free_all(curwin); - curwin->w_llist = ll_ref; - ll_ref->qf_refcount++; - } - } - else -@@ -1742,11 +1748,12 @@ qf_jump(qi, dir, errornr, forceit) - EMSG(_(e_nowrtmsg)); - ok = FALSE; - } - else - ok = do_ecmd(qf_ptr->qf_fnum, NULL, NULL, NULL, (linenr_T)1, -- ECMD_HIDE + ECMD_SET_HELP); -+ ECMD_HIDE + ECMD_SET_HELP, -+ oldwin == curwin ? curwin : NULL); - } - else - ok = buflist_getfile(qf_ptr->qf_fnum, - (linenr_T)1, GETF_SETMARK | GETF_SWITCH, forceit); - } -@@ -1890,11 +1897,10 @@ qf_list(eap) - char_u *fname; - qfline_T *qfp; - int i; - int idx1 = 1; - int idx2 = -1; -- int need_return = TRUE; - char_u *arg = eap->arg; - int all = eap->forceit; /* if not :cl!, only show - recognised errors */ - qf_info_T *qi = &ql_info; - -@@ -1930,17 +1936,13 @@ qf_list(eap) - qfp = qi->qf_lists[qi->qf_curlist].qf_start; - for (i = 1; !got_int && i <= qi->qf_lists[qi->qf_curlist].qf_count; ) - { - if ((qfp->qf_valid || all) && idx1 <= i && i <= idx2) - { -- if (need_return) -- { -- msg_putchar('\n'); -- if (got_int) -- break; -- need_return = FALSE; -- } -+ msg_putchar('\n'); -+ if (got_int) -+ break; - - fname = NULL; - if (qfp->qf_fnum != 0 - && (buf = buflist_findnr(qfp->qf_fnum)) != NULL) - { -@@ -1979,11 +1981,10 @@ qf_list(eap) - qf_fmt_text((fname != NULL || qfp->qf_lnum != 0) - ? skipwhite(qfp->qf_text) : qfp->qf_text, - IObuff, IOSIZE); - msg_prt_line(IObuff, FALSE); - out_flush(); /* show one line at a time */ -- need_return = TRUE; - } - - qfp = qfp->qf_next; - ++i; - ui_breakcheck(); -@@ -2231,11 +2232,10 @@ ex_cwindow(eap) - - /* - * ":cclose": close the window showing the list of errors. - * ":lclose": close the window showing the location list - */ --/*ARGSUSED*/ - void - ex_cclose(eap) - exarg_T *eap; - { - win_T *win = NULL; -@@ -2265,10 +2265,11 @@ ex_copen(eap) - qf_info_T *qi = &ql_info; - int height; - win_T *win; - tabpage_T *prevtab = curtab; - buf_T *qf_buf; -+ win_T *oldwin = curwin; - - if (eap->cmdidx == CMD_lopen || eap->cmdidx == CMD_lwindow) - { - qi = GET_LOC_LIST(curwin); - if (qi == NULL) -@@ -2305,43 +2306,48 @@ ex_copen(eap) - win = curwin; - - if (eap->cmdidx == CMD_copen || eap->cmdidx == CMD_cwindow) - /* Create the new window at the very bottom. */ - win_goto(lastwin); -- if (win_split(height, WSP_BELOW) == FAIL) -+ if (win_split(height, WSP_BELOW | WSP_NEWLOC) == FAIL) - return; /* not enough room for window */ - #ifdef FEAT_SCROLLBIND - curwin->w_p_scb = FALSE; - #endif - -- /* Remove the location list for the quickfix window */ -- qf_free_all(curwin); -- - if (eap->cmdidx == CMD_lopen || eap->cmdidx == CMD_lwindow) - { - /* - * For the location list window, create a reference to the - * location list from the window 'win'. - */ - curwin->w_llist_ref = win->w_llist; - win->w_llist->qf_refcount++; - } - -+ if (oldwin != curwin) -+ oldwin = NULL; /* don't store info when in another window */ - if (qf_buf != NULL) - /* Use the existing quickfix buffer */ - (void)do_ecmd(qf_buf->b_fnum, NULL, NULL, NULL, ECMD_ONE, -- ECMD_HIDE + ECMD_OLDBUF); -+ ECMD_HIDE + ECMD_OLDBUF, oldwin); - else - { - /* Create a new quickfix buffer */ -- (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE); -+ (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, oldwin); - /* switch off 'swapfile' */ - set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL); - set_option_value((char_u *)"bt", 0L, (char_u *)"quickfix", - OPT_LOCAL); - set_option_value((char_u *)"bh", 0L, (char_u *)"wipe", OPT_LOCAL); -- set_option_value((char_u *)"diff", 0L, NULL, OPT_LOCAL); -+#ifdef FEAT_DIFF -+ curwin->w_p_diff = FALSE; -+#endif -+#ifdef FEAT_FOLDING -+ set_option_value((char_u *)"fdm", 0L, (char_u *)"manual", -+ OPT_LOCAL); -+#endif - } - - /* Only set the height when still in the same tab page and there is no - * window to the side. */ - if (curtab == prevtab -@@ -2598,14 +2604,16 @@ qf_fill_buffer(qi) - * autocommands. */ - set_option_value((char_u *)"ft", 0L, (char_u *)"qf", OPT_LOCAL); - curbuf->b_p_ma = FALSE; - - #ifdef FEAT_AUTOCMD -+ keep_filetype = TRUE; /* don't detect 'filetype' */ - apply_autocmds(EVENT_BUFREADPOST, (char_u *)"quickfix", NULL, - FALSE, curbuf); - apply_autocmds(EVENT_BUFWINENTER, (char_u *)"quickfix", NULL, - FALSE, curbuf); -+ keep_filetype = FALSE; - #endif - - /* make sure it will be redrawn */ - redraw_curbuf_later(NOT_VALID); - -@@ -2757,11 +2765,11 @@ ex_make(eap) - if (cmd == NULL) - return; - sprintf((char *)cmd, "%s%s%s", (char *)p_shq, (char *)eap->arg, - (char *)p_shq); - if (*p_sp != NUL) -- append_redir(cmd, p_sp, fname); -+ append_redir(cmd, len, p_sp, fname); - /* - * Output a newline if there's something else than the :make command that - * was typed (in which case the cursor is in column 0). - */ - if (msg_col == 0) -@@ -3194,11 +3202,11 @@ ex_vimgrep(eap) - if ((flags & VGR_GLOBAL) == 0 - || regmatch.endpos[0].lnum > 0) - break; - col = regmatch.endpos[0].col - + (col == regmatch.endpos[0].col); -- if (col > STRLEN(ml_get_buf(buf, lnum, FALSE))) -+ if (col > (colnr_T)STRLEN(ml_get_buf(buf, lnum, FALSE))) - break; - } - line_breakcheck(); - if (got_int) - break; -@@ -3395,18 +3403,19 @@ load_dummy_buffer(fname) - return NULL; - - /* Init the options. */ - buf_copy_options(newbuf, BCO_ENTER | BCO_NOHELP); - -- /* set curwin/curbuf to buf and save a few things */ -- aucmd_prepbuf(&aco, newbuf); -+ /* need to open the memfile before putting the buffer in a window */ -+ if (ml_open(newbuf) == OK) -+ { -+ /* set curwin/curbuf to buf and save a few things */ -+ aucmd_prepbuf(&aco, newbuf); - -- /* Need to set the filename for autocommands. */ -- (void)setfname(curbuf, fname, NULL, FALSE); -+ /* Need to set the filename for autocommands. */ -+ (void)setfname(curbuf, fname, NULL, FALSE); - -- if (ml_open(curbuf) == OK) -- { - /* Create swap file now to avoid the ATTENTION message. */ - check_need_swap(TRUE); - - /* Remove the "dummy" flag, otherwise autocommands may not - * work. */ -@@ -3425,14 +3434,14 @@ load_dummy_buffer(fname) - if (buf_valid(newbuf)) - wipe_buffer(newbuf, FALSE); - newbuf = curbuf; - } - } -- } - -- /* restore curwin/curbuf and a few other things */ -- aucmd_restbuf(&aco); -+ /* restore curwin/curbuf and a few other things */ -+ aucmd_restbuf(&aco); -+ } - - if (!buf_valid(newbuf)) - return NULL; - if (failed) - { ---- vim72.orig/src/regexp.c -+++ vim72/src/regexp.c -@@ -469,11 +469,11 @@ get_char_class(pp) - #define CLASS_NONE 99 - int i; - - if ((*pp)[1] == ':') - { -- for (i = 0; i < sizeof(class_names) / sizeof(*class_names); ++i) -+ for (i = 0; i < (int)(sizeof(class_names) / sizeof(*class_names)); ++i) - if (STRNCMP(*pp + 2, class_names[i], STRLEN(class_names[i])) == 0) - { - *pp += STRLEN(class_names[i]) + 2; - return i; - } -@@ -581,10 +581,11 @@ static int regnpar; /* () count. */ - static int regnzpar; /* \z() count. */ - static int re_has_z; /* \z item detected */ - #endif - static char_u *regcode; /* Code-emit pointer, or JUST_CALC_SIZE */ - static long regsize; /* Code size. */ -+static int reg_toolong; /* TRUE when offset out of range */ - static char_u had_endbrace[NSUBEXP]; /* flags, TRUE if end of () found */ - static unsigned regflags; /* RF_ flags for prog */ - static long brace_min[10]; /* Minimums for complex brace repeats */ - static long brace_max[10]; /* Maximums for complex brace repeats */ - static int brace_count[10]; /* Current counts for complex brace repeats */ -@@ -1026,13 +1027,15 @@ vim_regcomp(expr, re_flags) - * Second pass: emit code. - */ - regcomp_start(expr, re_flags); - regcode = r->program; - regc(REGMAGIC); -- if (reg(REG_NOPAREN, &flags) == NULL) -+ if (reg(REG_NOPAREN, &flags) == NULL || reg_toolong) - { - vim_free(r); -+ if (reg_toolong) -+ EMSG_RET_NULL(_("E339: Pattern too long")); - return NULL; - } - - /* Dig out information for optimizations. */ - r->regstart = NUL; /* Worst-case defaults. */ -@@ -1139,10 +1142,11 @@ regcomp_start(expr, re_flags) - #ifdef FEAT_SYN_HL - regnzpar = 1; - re_has_z = 0; - #endif - regsize = 0L; -+ reg_toolong = FALSE; - regflags = 0; - #if defined(FEAT_SYN_HL) || defined(PROTO) - had_eol = FALSE; - #endif - } -@@ -1226,11 +1230,11 @@ reg(paren, flagp) - *flagp |= flags & (SPSTART | HASNL | HASLOOKBH); - while (peekchr() == Magic('|')) - { - skipchr(); - br = regbranch(&flags); -- if (br == NULL) -+ if (br == NULL || reg_toolong) - return NULL; - regtail(ret, br); /* BRANCH -> BRANCH. */ - if (!(flags & HASWIDTH)) - *flagp &= ~HASWIDTH; - *flagp |= flags & (SPSTART | HASNL | HASLOOKBH); -@@ -1311,10 +1315,12 @@ regbranch(flagp) - regtail(chain, latest); - if (peekchr() != Magic('&')) - break; - skipchr(); - regtail(latest, regnode(END)); /* operand ends */ -+ if (reg_toolong) -+ break; - reginsert(MATCH, latest); - chain = latest; - } - - return ret; -@@ -1380,11 +1386,11 @@ regconcat(flagp) - skipchr_keepstart(); - curchr = -1; - break; - default: - latest = regpiece(&flags); -- if (latest == NULL) -+ if (latest == NULL || reg_toolong) - return NULL; - *flagp |= flags & (HASWIDTH | HASNL | HASLOOKBH); - if (chain == NULL) /* First piece. */ - *flagp |= flags & SPSTART; - else -@@ -2538,12 +2544,20 @@ regtail(p, val) - - if (OP(scan) == BACK) - offset = (int)(scan - val); - else - offset = (int)(val - scan); -- *(scan + 1) = (char_u) (((unsigned)offset >> 8) & 0377); -- *(scan + 2) = (char_u) (offset & 0377); -+ /* When the offset uses more than 16 bits it can no longer fit in the two -+ * bytes avaliable. Use a global flag to avoid having to check return -+ * values in too many places. */ -+ if (offset > 0xffff) -+ reg_toolong = TRUE; -+ else -+ { -+ *(scan + 1) = (char_u) (((unsigned)offset >> 8) & 0377); -+ *(scan + 2) = (char_u) (offset & 0377); -+ } - } - - /* - * regoptail - regtail on item after a BRANCH; nop if none - */ -@@ -3360,16 +3374,15 @@ vim_regexec_multi(rmp, win, buf, lnum, c - - /* - * Match a regexp against a string ("line" points to the string) or multiple - * lines ("line" is NULL, use reg_getline()). - */ --/*ARGSUSED*/ - static long - vim_regexec_both(line, col, tm) - char_u *line; - colnr_T col; /* column to start looking for match */ -- proftime_T *tm; /* timeout limit or NULL */ -+ proftime_T *tm UNUSED; /* timeout limit or NULL */ - { - regprog_T *prog; - char_u *s; - long retval = 0L; - -@@ -4530,11 +4543,11 @@ regmatch(scan) - - no = op - BACKREF; - cleanup_subexpr(); - if (!REG_MULTI) /* Single-line regexp */ - { -- if (reg_endp[no] == NULL) -+ if (reg_startp[no] == NULL || reg_endp[no] == NULL) - { - /* Backref was not set: Match an empty string. */ - len = 0; - } - else -@@ -4546,11 +4559,11 @@ regmatch(scan) - status = RA_NOMATCH; - } - } - else /* Multi-line regexp */ - { -- if (reg_endpos[no].lnum < 0) -+ if (reg_startpos[no].lnum < 0 || reg_endpos[no].lnum < 0) - { - /* Backref was not set: Match an empty string. */ - len = 0; - } - else -@@ -5763,18 +5776,20 @@ do_class: - return (int)count; - } - - /* - * regnext - dig the "next" pointer out of a node -+ * Returns NULL when calculating size, when there is no next item and when -+ * there is an error. - */ - static char_u * - regnext(p) - char_u *p; - { - int offset; - -- if (p == JUST_CALC_SIZE) -+ if (p == JUST_CALC_SIZE || reg_toolong) - return NULL; - - offset = NEXT(p); - if (offset == 0) - return NULL; -@@ -6811,10 +6826,12 @@ static int can_f_submatch = FALSE; /* TR - /* These pointers are used instead of reg_match and reg_mmatch for - * reg_submatch(). Needed for when the substitution string is an expression - * that contains a call to substitute() and submatch(). */ - static regmatch_T *submatch_match; - static regmmatch_T *submatch_mmatch; -+static linenr_T submatch_firstlnum; -+static linenr_T submatch_maxline; - #endif - - #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) || defined(PROTO) - /* - * vim_regsub() - perform substitutions after a vim_regexec() or -@@ -6924,11 +6941,10 @@ vim_regsub_both(source, dest, copy, magi - eval_result = NULL; - } - } - else - { -- linenr_T save_reg_maxline; - win_T *save_reg_win; - int save_ireg_ic; - - vim_free(eval_result); - -@@ -6936,34 +6952,51 @@ vim_regsub_both(source, dest, copy, magi - * recursively. Make sure submatch() gets the text from the first - * level. Don't need to save "reg_buf", because - * vim_regexec_multi() can't be called recursively. */ - submatch_match = reg_match; - submatch_mmatch = reg_mmatch; -- save_reg_maxline = reg_maxline; -+ submatch_firstlnum = reg_firstlnum; -+ submatch_maxline = reg_maxline; - save_reg_win = reg_win; - save_ireg_ic = ireg_ic; - can_f_submatch = TRUE; - - eval_result = eval_to_string(source + 2, NULL, TRUE); - if (eval_result != NULL) - { -+ int had_backslash = FALSE; -+ - for (s = eval_result; *s != NUL; mb_ptr_adv(s)) - { - /* Change NL to CR, so that it becomes a line break. - * Skip over a backslashed character. */ - if (*s == NL) - *s = CAR; - else if (*s == '\\' && s[1] != NUL) -+ { - ++s; -+ had_backslash = TRUE; -+ } -+ } -+ if (had_backslash && backslash) -+ { -+ /* Backslashes will be consumed, need to double them. */ -+ s = vim_strsave_escaped(eval_result, (char_u *)"\\"); -+ if (s != NULL) -+ { -+ vim_free(eval_result); -+ eval_result = s; -+ } - } - - dst += STRLEN(eval_result); - } - - reg_match = submatch_match; - reg_mmatch = submatch_mmatch; -- reg_maxline = save_reg_maxline; -+ reg_firstlnum = submatch_firstlnum; -+ reg_maxline = submatch_maxline; - reg_win = save_reg_win; - ireg_ic = save_ireg_ic; - can_f_submatch = FALSE; - } - #endif -@@ -7194,10 +7227,35 @@ vim_regsub_both(source, dest, copy, magi - exit: - return (int)((dst - dest) + 1); - } - - #ifdef FEAT_EVAL -+static char_u *reg_getline_submatch __ARGS((linenr_T lnum)); -+ -+/* -+ * Call reg_getline() with the line numbers from the submatch. If a -+ * substitute() was used the reg_maxline and other values have been -+ * overwritten. -+ */ -+ static char_u * -+reg_getline_submatch(lnum) -+ linenr_T lnum; -+{ -+ char_u *s; -+ linenr_T save_first = reg_firstlnum; -+ linenr_T save_max = reg_maxline; -+ -+ reg_firstlnum = submatch_firstlnum; -+ reg_maxline = submatch_maxline; -+ -+ s = reg_getline(lnum); -+ -+ reg_firstlnum = save_first; -+ reg_maxline = save_max; -+ return s; -+} -+ - /* - * Used for the submatch() function: get the string from the n'th submatch in - * allocated memory. - * Returns NULL when not in a ":s" command and for a non-existing submatch. - */ -@@ -7224,11 +7282,11 @@ reg_submatch(no) - { - lnum = submatch_mmatch->startpos[no].lnum; - if (lnum < 0 || submatch_mmatch->endpos[no].lnum < 0) - return NULL; - -- s = reg_getline(lnum) + submatch_mmatch->startpos[no].col; -+ s = reg_getline_submatch(lnum) + submatch_mmatch->startpos[no].col; - if (s == NULL) /* anti-crash check, cannot happen? */ - break; - if (submatch_mmatch->endpos[no].lnum == lnum) - { - /* Within one line: take form start to end col. */ -@@ -7250,20 +7308,20 @@ reg_submatch(no) - } - ++len; - ++lnum; - while (lnum < submatch_mmatch->endpos[no].lnum) - { -- s = reg_getline(lnum++); -+ s = reg_getline_submatch(lnum++); - if (round == 2) - STRCPY(retval + len, s); - len += (int)STRLEN(s); - if (round == 2) - retval[len] = '\n'; - ++len; - } - if (round == 2) -- STRNCPY(retval + len, reg_getline(lnum), -+ STRNCPY(retval + len, reg_getline_submatch(lnum), - submatch_mmatch->endpos[no].col); - len += submatch_mmatch->endpos[no].col; - if (round == 2) - retval[len] = NUL; - ++len; -@@ -7277,17 +7335,15 @@ reg_submatch(no) - } - } - } - else - { -- if (submatch_match->endp[no] == NULL) -+ s = submatch_match->startp[no]; -+ if (s == NULL || submatch_match->endp[no] == NULL) - retval = NULL; - else -- { -- s = submatch_match->startp[no]; - retval = vim_strnsave(s, (int)(submatch_match->endp[no] - s)); -- } - } - - return retval; - } - #endif ---- vim72.orig/src/screen.c -+++ vim72/src/screen.c -@@ -23,14 +23,15 @@ - * - * For double-byte characters, two consecutive bytes in ScreenLines[] can form - * one character which occupies two display cells. - * For UTF-8 a multi-byte character is converted to Unicode and stored in - * ScreenLinesUC[]. ScreenLines[] contains the first byte only. For an ASCII -- * character without composing chars ScreenLinesUC[] will be 0. When the -- * character occupies two display cells the next byte in ScreenLines[] is 0. -+ * character without composing chars ScreenLinesUC[] will be 0 and -+ * ScreenLinesC[][] is not used. When the character occupies two display -+ * cells the next byte in ScreenLines[] is 0. - * ScreenLinesC[][] contain up to 'maxcombine' composing characters -- * (drawn on top of the first character). They are 0 when not used. -+ * (drawn on top of the first character). There is 0 after the last one used. - * ScreenLines2[] is only used for euc-jp to store the second byte if the - * first byte is 0x8e (single-width character). - * - * The screen_*() functions write to the screen and handle updating - * ScreenLines[]. -@@ -130,11 +131,11 @@ static void screen_line __ARGS((int row, - #endif - #ifdef FEAT_VERTSPLIT - static void draw_vsep_win __ARGS((win_T *wp, int row)); - #endif - #ifdef FEAT_STL_OPT --static void redraw_custum_statusline __ARGS((win_T *wp)); -+static void redraw_custom_statusline __ARGS((win_T *wp)); - #endif - #ifdef FEAT_SEARCH_EXTRA - #define SEARCH_HL_PRIORITY 0 - static void start_search_hl __ARGS((void)); - static void end_search_hl __ARGS((void)); -@@ -268,15 +269,14 @@ redraw_buf_later(buf, type) - * Used when entering/leaving Insert mode with the cursor on a folded line. - * Used to remove the "$" from a change command. - * Note that when also inserting/deleting lines w_redraw_top and w_redraw_bot - * may become invalid and the whole window will have to be redrawn. - */ --/*ARGSUSED*/ - void - redrawWinline(lnum, invalid) - linenr_T lnum; -- int invalid; /* window line height is invalid now */ -+ int invalid UNUSED; /* window line height is invalid now */ - { - #ifdef FEAT_FOLDING - int i; - #endif - -@@ -322,10 +322,11 @@ update_screen(type) - static int did_intro = FALSE; - #if defined(FEAT_SEARCH_EXTRA) || defined(FEAT_CLIPBOARD) - int did_one; - #endif - -+ /* Don't do anything if the screen structures are (not yet) valid. */ - if (!screen_valid(TRUE)) - return; - - if (must_redraw) - { -@@ -341,11 +342,13 @@ update_screen(type) - - /* Need to update w_lines[]. */ - if (curwin->w_lines_valid == 0 && type < NOT_VALID) - type = NOT_VALID; - -- if (!redrawing()) -+ /* Postpone the redrawing when it's not needed and when being called -+ * recursively. */ -+ if (!redrawing() || updating_screen) - { - redraw_later(type); /* remember type for next time */ - must_redraw = type; - if (type > INVERTED_ALL) - curwin->w_lines_valid = 0; /* don't use w_lines[].wl_size now */ -@@ -581,10 +584,11 @@ update_screen(type) - static void update_prepare __ARGS((void)); - static void update_finish __ARGS((void)); - - /* - * Prepare for updating one or more windows. -+ * Caller must check for "updating_screen" already set to avoid recursiveness. - */ - static void - update_prepare() - { - cursor_off(); -@@ -662,11 +666,13 @@ update_debug_sign(buf, lnum) - redraw_win_later(wp, VALID); - if (wp->w_redr_type != 0) - doit = TRUE; - } - -- if (!doit) -+ /* Return when there is nothing to do or screen updating already -+ * happening. */ -+ if (!doit || updating_screen) - return; - - /* update all windows that need updating */ - update_prepare(); - -@@ -695,10 +701,14 @@ update_debug_sign(buf, lnum) - */ - void - updateWindow(wp) - win_T *wp; - { -+ /* return if already busy updating */ -+ if (updating_screen) -+ return; -+ - update_prepare(); - - #ifdef FEAT_CLIPBOARD - /* When Visual area changed, may have to update selection. */ - if (clip_star.available && clip_isautosel()) -@@ -2324,17 +2334,16 @@ fold_line(wp, fold_count, foldinfo, lnum - } - } - if (cells > 1) - ScreenLines[idx + 1] = 0; - } -- else if (cells > 1) /* double-byte character */ -- { -- if (enc_dbcs == DBCS_JPNU && *p == 0x8e) -- ScreenLines2[idx] = p[1]; -- else -- ScreenLines[idx + 1] = p[1]; -- } -+ else if (enc_dbcs == DBCS_JPNU && *p == 0x8e) -+ /* double-byte single width character */ -+ ScreenLines2[idx] = p[1]; -+ else if (cells > 1) -+ /* double-width character */ -+ ScreenLines[idx + 1] = p[1]; - col += cells; - idx += cells; - p += c_len; - } - } -@@ -2411,11 +2420,11 @@ fold_line(wp, fold_count, foldinfo, lnum - || (lnum == top->lnum - && top->col == 0)) - && (lnume < bot->lnum - || (lnume == bot->lnum - && (bot->col - (*p_sel == 'e')) -- >= STRLEN(ml_get_buf(wp->w_buffer, lnume, FALSE))))))) -+ >= (colnr_T)STRLEN(ml_get_buf(wp->w_buffer, lnume, FALSE))))))) - { - if (VIsual_mode == Ctrl_V) - { - /* Visual block mode: highlight the chars part of the block */ - if (wp->w_old_cursor_fcol + txtcol < (colnr_T)W_WIDTH(wp)) -@@ -2437,13 +2446,21 @@ fold_line(wp, fold_count, foldinfo, lnum - } - #endif - - #ifdef FEAT_SYN_HL - /* Show 'cursorcolumn' in the fold line. */ -- if (wp->w_p_cuc && (int)wp->w_virtcol + txtcol < W_WIDTH(wp)) -- ScreenAttrs[off + wp->w_virtcol + txtcol] = hl_combine_attr( -- ScreenAttrs[off + wp->w_virtcol + txtcol], hl_attr(HLF_CUC)); -+ if (wp->w_p_cuc) -+ { -+ txtcol += wp->w_virtcol; -+ if (wp->w_p_wrap) -+ txtcol -= wp->w_skipcol; -+ else -+ txtcol -= wp->w_leftcol; -+ if (txtcol >= 0 && txtcol < W_WIDTH(wp)) -+ ScreenAttrs[off + txtcol] = hl_combine_attr( -+ ScreenAttrs[off + txtcol], hl_attr(HLF_CUC)); -+ } - #endif - - SCREEN_LINE(row + W_WINROW(wp), W_WINCOL(wp), (int)W_WIDTH(wp), - (int)W_WIDTH(wp), FALSE); - -@@ -2539,18 +2556,17 @@ fill_foldcolumn(p, wp, closed, lnum) - * Start at row "startrow", stop when "endrow" is reached. - * wp->w_virtcol needs to be valid. - * - * Return the number of last row the line occupies. - */ --/* ARGSUSED */ - static int - win_line(wp, lnum, startrow, endrow, nochange) - win_T *wp; - linenr_T lnum; - int startrow; - int endrow; -- int nochange; /* not updating for changed text */ -+ int nochange UNUSED; /* not updating for changed text */ - { - int col; /* visual column on screen */ - unsigned off; /* offset in ScreenLines/ScreenAttrs */ - int c = 0; /* init for GCC */ - long vcol = 0; /* virtual column (for tabs) */ -@@ -2586,10 +2602,11 @@ win_line(wp, lnum, startrow, endrow, noc - int fromcol, tocol; /* start/end of inverting */ - int fromcol_prev = -2; /* start of inverting after cursor */ - int noinvcur = FALSE; /* don't invert the cursor */ - #ifdef FEAT_VISUAL - pos_T *top, *bot; -+ int lnum_in_visual_area = FALSE; - #endif - pos_T pos; - long v; - - int char_attr = 0; /* attributes for next character */ -@@ -2782,13 +2799,14 @@ win_line(wp, lnum, startrow, endrow, noc - else /* Visual is before curwin->w_cursor */ - { - top = &VIsual; - bot = &curwin->w_cursor; - } -+ lnum_in_visual_area = (lnum >= top->lnum && lnum <= bot->lnum); - if (VIsual_mode == Ctrl_V) /* block mode */ - { -- if (lnum >= top->lnum && lnum <= bot->lnum) -+ if (lnum_in_visual_area) - { - fromcol = wp->w_old_cursor_fcol; - tocol = wp->w_old_cursor_lcol; - } - } -@@ -2877,12 +2895,13 @@ win_line(wp, lnum, startrow, endrow, noc - pos.col = search_match_endcol; - getvcol(curwin, &pos, (colnr_T *)&tocol, NULL, NULL); - } - else - tocol = MAXCOL; -- if (fromcol == tocol) /* do at least one character */ -- tocol = fromcol + 1; /* happens when past end of line */ -+ /* do at least one character; happens when past end of line */ -+ if (fromcol == tocol) -+ tocol = fromcol + 1; - area_highlighting = TRUE; - attr = hl_attr(HLF_I); - } - - #ifdef FEAT_DIFF -@@ -2997,15 +3016,37 @@ win_line(wp, lnum, startrow, endrow, noc - prev_ptr = ptr; - #endif - mb_ptr_adv(ptr); - } - --#ifdef FEAT_VIRTUALEDIT -- /* When 'virtualedit' is set the end of the line may be before the -- * start of the displayed part. */ -- if (vcol < v && *ptr == NUL && virtual_active()) -+#if defined(FEAT_SYN_HL) || defined(FEAT_VIRTUALEDIT) || defined(FEAT_VISUAL) -+ /* When: -+ * - 'cuc' is set, or -+ * - 'virtualedit' is set, or -+ * - the visual mode is active, -+ * the end of the line may be before the start of the displayed part. -+ */ -+ if (vcol < v && ( -+# ifdef FEAT_SYN_HL -+ wp->w_p_cuc -+# if defined(FEAT_VIRTUALEDIT) || defined(FEAT_VISUAL) -+ || -+# endif -+# endif -+# ifdef FEAT_VIRTUALEDIT -+ virtual_active() -+# ifdef FEAT_VISUAL -+ || -+# endif -+# endif -+# ifdef FEAT_VISUAL -+ (VIsual_active && wp->w_buffer == curwin->w_buffer) -+# endif -+ )) -+ { - vcol = v; -+ } - #endif - - /* Handle a character that's not completely on the screen: Put ptr at - * that character but skip the first few screen characters. */ - if (vcol > v) -@@ -3410,10 +3451,11 @@ win_line(wp, lnum, startrow, endrow, noc - #ifdef FEAT_MBYTE - || (has_mbyte && vcol + 1 == fromcol && n_extra == 0 - && (*mb_ptr2cells)(ptr) > 1) - #endif - || ((int)vcol_prev == fromcol_prev -+ && vcol_prev < vcol /* not at margin */ - && vcol < tocol)) - area_attr = attr; /* start highlighting */ - else if (area_attr != 0 - && (vcol == tocol - || (noinvcur && (colnr_T)vcol == wp->w_virtcol))) -@@ -3542,11 +3584,12 @@ win_line(wp, lnum, startrow, endrow, noc - char_attr = search_attr; - #ifdef LINE_ATTR - /* Use line_attr when not in the Visual or 'incsearch' area - * (area_attr may be 0 when "noinvcur" is set). */ - else if (line_attr != 0 && ((fromcol == -10 && tocol == MAXCOL) -- || (vcol < fromcol || vcol >= tocol))) -+ || vcol < fromcol || vcol_prev < fromcol_prev -+ || vcol >= tocol)) - char_attr = line_attr; - #endif - else - { - attr_pri = FALSE; -@@ -4104,10 +4147,11 @@ win_line(wp, lnum, startrow, endrow, noc - # ifdef FEAT_RIGHTLEFT - wp->w_p_rl ? (col >= 0) : - # endif - (col < W_WIDTH(wp))) - && !(noinvcur -+ && lnum == wp->w_cursor.lnum - && (colnr_T)vcol == wp->w_virtcol))) - && lcs_eol_one >= 0) - { - /* Display a '$' after the line or highlight an extra - * character if the line break is included. */ -@@ -4245,20 +4289,20 @@ win_line(wp, lnum, startrow, endrow, noc - #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK) - /* XIM don't send preedit_start and preedit_end, but they send - * preedit_changed and commit. Thus Vim can't set "im_is_active", use - * im_is_preediting() here. */ - if (xic != NULL -- && lnum == curwin->w_cursor.lnum -+ && lnum == wp->w_cursor.lnum - && (State & INSERT) - && !p_imdisable - && im_is_preediting() - && draw_state == WL_LINE) - { - colnr_T tcol; - - if (preedit_end_col == MAXCOL) -- getvcol(curwin, &(curwin->w_cursor), &tcol, NULL, NULL); -+ getvcol(curwin, &(wp->w_cursor), &tcol, NULL, NULL); - else - tcol = preedit_end_col; - if ((long)preedit_start_col <= vcol && vcol < (long)tcol) - { - if (feedback_old_attr < 0) -@@ -4351,11 +4395,17 @@ win_line(wp, lnum, startrow, endrow, noc - cur = cur->next; - } - } - #endif - if (lcs_eol == lcs_eol_one -- && ((area_attr != 0 && vcol == fromcol && c == NUL) -+ && ((area_attr != 0 && vcol == fromcol -+#ifdef FEAT_VISUAL -+ && (VIsual_mode != Ctrl_V -+ || lnum == VIsual.lnum -+ || lnum == curwin->w_cursor.lnum) -+#endif -+ && c == NUL) - #ifdef FEAT_SEARCH_EXTRA - /* highlight 'hlsearch' match at end of line */ - || (prevcol_hl_flag == TRUE - # if defined(LINE_ATTR) - && did_line_attr <= 1 -@@ -4445,11 +4495,12 @@ win_line(wp, lnum, startrow, endrow, noc - * At end of the text line. - */ - if (c == NUL) - { - #ifdef FEAT_SYN_HL -- if (eol_hl_off > 0 && vcol - eol_hl_off == (long)wp->w_virtcol) -+ if (eol_hl_off > 0 && vcol - eol_hl_off == (long)wp->w_virtcol -+ && lnum == wp->w_cursor.lnum) - { - /* highlight last char after line */ - --col; - --off; - --vcol; -@@ -4547,11 +4598,12 @@ win_line(wp, lnum, startrow, endrow, noc - #ifdef FEAT_SYN_HL - /* Highlight the cursor column if 'cursorcolumn' is set. But don't - * highlight the cursor position itself. */ - if (wp->w_p_cuc && vcol == (long)wp->w_virtcol - && lnum != wp->w_cursor.lnum -- && draw_state == WL_LINE) -+ && draw_state == WL_LINE -+ && !lnum_in_visual_area) - { - vcol_save_attr = char_attr; - char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUC)); - } - else -@@ -4577,11 +4629,15 @@ win_line(wp, lnum, startrow, endrow, noc - } - #endif - ScreenLines[off] = c; - #ifdef FEAT_MBYTE - if (enc_dbcs == DBCS_JPNU) -+ { -+ if ((mb_c & 0xff00) == 0x8e00) -+ ScreenLines[off] = 0x8e; - ScreenLines2[off] = mb_c & 0xff; -+ } - else if (enc_utf8) - { - if (mb_utf8) - { - int i; -@@ -4650,11 +4706,11 @@ win_line(wp, lnum, startrow, endrow, noc - } - else - --n_skip; - - /* Only advance the "vcol" when after the 'number' column. */ -- if (draw_state >= WL_SBR -+ if (draw_state > WL_NR - #ifdef FEAT_DIFF - && filler_todo <= 0 - #endif - ) - ++vcol; -@@ -4836,10 +4892,11 @@ win_line(wp, lnum, startrow, endrow, noc - #ifdef FEAT_MBYTE - static int comp_char_differs __ARGS((int, int)); - - /* - * Return if the composing characters at "off_from" and "off_to" differ. -+ * Only to be used when ScreenLinesUC[off_from] != 0. - */ - static int - comp_char_differs(off_from, off_to) - int off_from; - int off_to; -@@ -5117,12 +5174,12 @@ screen_line(row, coloff, endcol, clear_w - if (char_cells == 2) - ScreenLines[off_to + 1] = ScreenLines[off_from + 1]; - #endif - - #if defined(FEAT_GUI) || defined(UNIX) -- /* The bold trick makes a single row of pixels appear in the next -- * character. When a bold character is removed, the next -+ /* The bold trick makes a single column of pixels appear in the -+ * next character. When a bold character is removed, the next - * character should be redrawn too. This happens for our own GUI - * and for some xterms. */ - if ( - # ifdef FEAT_GUI - gui.in_use -@@ -5721,10 +5778,17 @@ win_redr_status(wp) - char_u *p; - int len; - int fillchar; - int attr; - int this_ru_col; -+ static int busy = FALSE; -+ -+ /* It's possible to get here recursively when 'statusline' (indirectly) -+ * invokes ":redrawstatus". Simply ignore the call then. */ -+ if (busy) -+ return; -+ busy = TRUE; - - wp->w_redr_status = FALSE; - if (wp->w_status_height == 0) - { - /* no status line, can only be last window */ -@@ -5743,11 +5807,11 @@ win_redr_status(wp) - } - #ifdef FEAT_STL_OPT - else if (*p_stl != NUL || *wp->w_p_stl != NUL) - { - /* redraw custom status line */ -- redraw_custum_statusline(wp); -+ redraw_custom_statusline(wp); - } - #endif - else - { - fillchar = fillchar_status(&attr, wp == curwin); -@@ -5859,30 +5923,44 @@ win_redr_status(wp) - fillchar = fillchar_vsep(&attr); - screen_putchar(fillchar, W_WINROW(wp) + wp->w_height, W_ENDCOL(wp), - attr); - } - #endif -+ busy = FALSE; - } - - #ifdef FEAT_STL_OPT - /* - * Redraw the status line according to 'statusline' and take care of any - * errors encountered. - */ - static void --redraw_custum_statusline(wp) -+redraw_custom_statusline(wp) - win_T *wp; - { -- int save_called_emsg = called_emsg; -+ static int entered = FALSE; -+ int save_called_emsg = called_emsg; -+ -+ /* When called recursively return. This can happen when the statusline -+ * contains an expression that triggers a redraw. */ -+ if (entered) -+ return; -+ entered = TRUE; - - called_emsg = FALSE; - win_redr_custom(wp, FALSE); - if (called_emsg) -+ { -+ /* When there is an error disable the statusline, otherwise the -+ * display is messed up with errors and a redraw triggers the problem -+ * again and again. */ - set_string_option_direct((char_u *)"statusline", -1, - (char_u *)"", OPT_FREE | (*wp->w_p_stl != NUL - ? OPT_LOCAL : OPT_GLOBAL), SID_ERROR); -+ } - called_emsg |= save_called_emsg; -+ entered = FALSE; - } - #endif - - # ifdef FEAT_VERTSPLIT - /* -@@ -5986,20 +6064,21 @@ win_redr_custom(wp, draw_ruler) - int width; - int n; - int len; - int fillchar; - char_u buf[MAXPATHL]; -+ char_u *stl; - char_u *p; - struct stl_hlrec hltab[STL_MAX_ITEM]; - struct stl_hlrec tabtab[STL_MAX_ITEM]; - int use_sandbox = FALSE; - - /* setup environment for the task at hand */ - if (wp == NULL) - { - /* Use 'tabline'. Always at the first line of the screen. */ -- p = p_tal; -+ stl = p_tal; - row = 0; - fillchar = ' '; - attr = hl_attr(HLF_TPF); - maxwidth = Columns; - # ifdef FEAT_EVAL -@@ -6012,21 +6091,21 @@ win_redr_custom(wp, draw_ruler) - fillchar = fillchar_status(&attr, wp == curwin); - maxwidth = W_WIDTH(wp); - - if (draw_ruler) - { -- p = p_ruf; -+ stl = p_ruf; - /* advance past any leading group spec - implicit in ru_col */ -- if (*p == '%') -+ if (*stl == '%') - { -- if (*++p == '-') -- p++; -- if (atoi((char *) p)) -- while (VIM_ISDIGIT(*p)) -- p++; -- if (*p++ != '(') -- p = p_ruf; -+ if (*++stl == '-') -+ stl++; -+ if (atoi((char *)stl)) -+ while (VIM_ISDIGIT(*stl)) -+ stl++; -+ if (*stl++ != '(') -+ stl = p_ruf; - } - #ifdef FEAT_VERTSPLIT - col = ru_col - (Columns - W_WIDTH(wp)); - if (col < (W_WIDTH(wp) + 1) / 2) - col = (W_WIDTH(wp) + 1) / 2; -@@ -6051,13 +6130,13 @@ win_redr_custom(wp, draw_ruler) - # endif - } - else - { - if (*wp->w_p_stl != NUL) -- p = wp->w_p_stl; -+ stl = wp->w_p_stl; - else -- p = p_stl; -+ stl = p_stl; - # ifdef FEAT_EVAL - use_sandbox = was_set_insecurely((char_u *)"statusline", - *wp->w_p_stl == NUL ? 0 : OPT_LOCAL); - # endif - } -@@ -6068,17 +6147,21 @@ win_redr_custom(wp, draw_ruler) - } - - if (maxwidth <= 0) - return; - -+ /* Make a copy, because the statusline may include a function call that -+ * might change the option value and free the memory. */ -+ stl = vim_strsave(stl); - width = build_stl_str_hl(wp == NULL ? curwin : wp, - buf, sizeof(buf), -- p, use_sandbox, -+ stl, use_sandbox, - fillchar, maxwidth, hltab, tabtab); -+ vim_free(stl); - len = (int)STRLEN(buf); - -- while (width < maxwidth && len < sizeof(buf) - 1) -+ while (width < maxwidth && len < (int)sizeof(buf) - 1) - { - #ifdef FEAT_MBYTE - len += (*mb_char2bytes)(fillchar, buf + len); - #else - buf[len++] = fillchar; -@@ -6198,10 +6281,11 @@ screen_getbytes(row, col, bytes, attrp) - static int screen_comp_differs __ARGS((int, int*)); - - /* - * Return TRUE if composing characters for screen posn "off" differs from - * composing characters in "u8cc". -+ * Only to be used when ScreenLinesUC[off] != 0. - */ - static int - screen_comp_differs(off, u8cc) - int off; - int *u8cc; -@@ -6261,26 +6345,43 @@ screen_puts_len(text, len, row, col, att - int prev_c = 0; /* previous Arabic character */ - int pc, nc, nc1; - int pcc[MAX_MCO]; - # endif - #endif -+#if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX) -+ int force_redraw_this; -+ int force_redraw_next = FALSE; -+#endif -+ int need_redraw; - - if (ScreenLines == NULL || row >= screen_Rows) /* safety check */ - return; -+ off = LineOffset[row] + col; - - #ifdef FEAT_MBYTE - /* When drawing over the right halve of a double-wide char clear out the - * left halve. Only needed in a terminal. */ - if (has_mbyte && col > 0 && col < screen_Columns - # ifdef FEAT_GUI - && !gui.in_use - # endif - && mb_fix_col(col, row) != col) -- screen_puts_len((char_u *)" ", 1, row, col - 1, 0); -+ { -+ ScreenLines[off - 1] = ' '; -+ ScreenAttrs[off - 1] = 0; -+ if (enc_utf8) -+ { -+ ScreenLinesUC[off - 1] = 0; -+ ScreenLinesC[0][off - 1] = 0; -+ } -+ /* redraw the previous cell, make it empty */ -+ screen_char(off - 1, row, col - 1); -+ /* force the cell at "col" to be redrawn */ -+ force_redraw_next = TRUE; -+ } - #endif - -- off = LineOffset[row] + col; - #ifdef FEAT_MBYTE - max_off = LineOffset[row] + screen_Columns; - #endif - while (col < screen_Columns - && (len < 0 || (int)(ptr - text) < len) -@@ -6326,76 +6427,82 @@ screen_puts_len(text, len, row, col, att - nc = NUL; - nc1 = NUL; - } - else - { -- nc = utfc_ptr2char(ptr + mbyte_blen, pcc); -+ nc = utfc_ptr2char_len(ptr + mbyte_blen, pcc, -+ (int)((text + len) - ptr - mbyte_blen)); - nc1 = pcc[0]; - } - pc = prev_c; - prev_c = u8c; - u8c = arabic_shape(u8c, &c, &u8cc[0], nc, nc1, pc); - } - else - prev_c = u8c; - # endif -+ if (col + mbyte_cells > screen_Columns) -+ { -+ /* Only 1 cell left, but character requires 2 cells: -+ * display a '>' in the last column to avoid wrapping. */ -+ c = '>'; -+ mbyte_cells = 1; -+ } - } - } - #endif - -- if (ScreenLines[off] != c -+#if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX) -+ force_redraw_this = force_redraw_next; -+ force_redraw_next = FALSE; -+#endif -+ -+ need_redraw = ScreenLines[off] != c - #ifdef FEAT_MBYTE - || (mbyte_cells == 2 - && ScreenLines[off + 1] != (enc_dbcs ? ptr[1] : 0)) - || (enc_dbcs == DBCS_JPNU - && c == 0x8e - && ScreenLines2[off] != ptr[1]) - || (enc_utf8 -- && (ScreenLinesUC[off] != (u8char_T)u8c -- || screen_comp_differs(off, u8cc))) -+ && (ScreenLinesUC[off] != -+ (u8char_T)(c < 0x80 && u8cc[0] == 0 ? 0 : u8c) -+ || (ScreenLinesUC[off] != 0 -+ && screen_comp_differs(off, u8cc)))) - #endif - || ScreenAttrs[off] != attr -- || exmode_active -+ || exmode_active; -+ -+ if (need_redraw -+#if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX) -+ || force_redraw_this -+#endif - ) - { - #if defined(FEAT_GUI) || defined(UNIX) - /* The bold trick makes a single row of pixels appear in the next - * character. When a bold character is removed, the next - * character should be redrawn too. This happens for our own GUI -- * and for some xterms. -- * Force the redraw by setting the attribute to a different value -- * than "attr", the contents of ScreenLines[] may be needed by -- * mb_off2cells() further on. -- * Don't do this for the last drawn character, because the next -- * character may not be redrawn. */ -- if ( -+ * and for some xterms. */ -+ if (need_redraw && ScreenLines[off] != ' ' && ( - # ifdef FEAT_GUI - gui.in_use - # endif - # if defined(FEAT_GUI) && defined(UNIX) - || - # endif - # ifdef UNIX - term_is_xterm - # endif -- ) -+ )) - { -- int n; -+ int n = ScreenAttrs[off]; - -- n = ScreenAttrs[off]; --# ifdef FEAT_MBYTE -- if (col + mbyte_cells < screen_Columns -- && (n > HL_ALL || (n & HL_BOLD)) -- && (len < 0 ? ptr[mbyte_blen] != NUL -- : ptr + mbyte_blen < text + len)) -- ScreenAttrs[off + mbyte_cells] = attr + 1; --# else -- if (col + 1 < screen_Columns -- && (n > HL_ALL || (n & HL_BOLD)) -- && (len < 0 ? ptr[1] != NUL : ptr + 1 < text + len)) -- ScreenLines[off + 1] = 0; --# endif -+ if (n > HL_ALL) -+ n = syn_attr2attr(n); -+ if (n & HL_BOLD) -+ force_redraw_next = TRUE; - } - #endif - #ifdef FEAT_MBYTE - /* When at the end of the text and overwriting a two-cell - * character with a one-cell character, need to clear the next -@@ -6478,10 +6585,24 @@ screen_puts_len(text, len, row, col, att - ++off; - ++col; - ++ptr; - } - } -+ -+#if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX) -+ /* If we detected the next character needs to be redrawn, but the text -+ * doesn't extend up to there, update the character here. */ -+ if (force_redraw_next && col < screen_Columns) -+ { -+# ifdef FEAT_MBYTE -+ if (enc_dbcs != 0 && dbcs_off2cells(off, max_off) > 1) -+ screen_char_2(off, row, col); -+ else -+# endif -+ screen_char(off, row, col); -+ } -+#endif - } - - #ifdef FEAT_SEARCH_EXTRA - /* - * Prepare for 'hlsearch' highlighting. -@@ -7354,11 +7475,15 @@ screenalloc(clear) - short *new_TabPageIdxs; - tabpage_T *tp; - #endif - static int entered = FALSE; /* avoid recursiveness */ - static int done_outofmem_msg = FALSE; /* did outofmem message */ -+#ifdef FEAT_AUTOCMD -+ int retry_count = 0; - -+retry: -+#endif - /* - * Allocation of the screen buffers is done only when the size changes and - * when Rows and Columns have been set and we have started doing full - * screen stuff. - */ -@@ -7406,21 +7531,25 @@ screenalloc(clear) - * Continuing with the old ScreenLines may result in a crash, because the - * size is wrong. - */ - FOR_ALL_TAB_WINDOWS(tp, wp) - win_free_lsize(wp); -+#ifdef FEAT_AUTOCMD -+ if (aucmd_win != NULL) -+ win_free_lsize(aucmd_win); -+#endif - - new_ScreenLines = (schar_T *)lalloc((long_u)( - (Rows + 1) * Columns * sizeof(schar_T)), FALSE); - #ifdef FEAT_MBYTE -- vim_memset(new_ScreenLinesC, 0, sizeof(u8char_T) * MAX_MCO); -+ vim_memset(new_ScreenLinesC, 0, sizeof(u8char_T *) * MAX_MCO); - if (enc_utf8) - { - new_ScreenLinesUC = (u8char_T *)lalloc((long_u)( - (Rows + 1) * Columns * sizeof(u8char_T)), FALSE); - for (i = 0; i < p_mco; ++i) -- new_ScreenLinesC[i] = (u8char_T *)lalloc((long_u)( -+ new_ScreenLinesC[i] = (u8char_T *)lalloc_clear((long_u)( - (Rows + 1) * Columns * sizeof(u8char_T)), FALSE); - } - if (enc_dbcs == DBCS_JPNU) - new_ScreenLines2 = (schar_T *)lalloc((long_u)( - (Rows + 1) * Columns * sizeof(schar_T)), FALSE); -@@ -7438,14 +7567,22 @@ screenalloc(clear) - { - if (win_alloc_lines(wp) == FAIL) - { - outofmem = TRUE; - #ifdef FEAT_WINDOWS -- break; -+ goto give_up; - #endif - } - } -+#ifdef FEAT_AUTOCMD -+ if (aucmd_win != NULL && aucmd_win->w_lines == NULL -+ && win_alloc_lines(aucmd_win) == FAIL) -+ outofmem = TRUE; -+#endif -+#ifdef FEAT_WINDOWS -+give_up: -+#endif - - #ifdef FEAT_MBYTE - for (i = 0; i < p_mco; ++i) - if (new_ScreenLinesC[i] == NULL) - break; -@@ -7626,12 +7763,21 @@ screenalloc(clear) - - entered = FALSE; - --RedrawingDisabled; - - #ifdef FEAT_AUTOCMD -- if (starting == 0) -+ /* -+ * Do not apply autocommands more than 3 times to avoid an endless loop -+ * in case applying autocommands always changes Rows or Columns. -+ */ -+ if (starting == 0 && ++retry_count <= 3) -+ { - apply_autocmds(EVENT_VIMRESIZED, NULL, NULL, FALSE, curbuf); -+ /* In rare cases, autocommands may have altered Rows or Columns, -+ * jump back to check if we need to allocate the screen again. */ -+ goto retry; -+ } - #endif - } - - void - free_screenlines() -@@ -8588,19 +8734,18 @@ screen_ins_lines(off, row, line_count, e - * When scrolling region used 'off' is the offset from the top for the region. - * 'row' and 'end' are relative to the start of the region. - * - * Return OK for success, FAIL if the lines are not deleted. - */ --/*ARGSUSED*/ - int - screen_del_lines(off, row, line_count, end, force, wp) - int off; - int row; - int line_count; - int end; - int force; /* even when line_count > p_ttyscroll */ -- win_T *wp; /* NULL or window to use width from */ -+ win_T *wp UNUSED; /* NULL or window to use width from */ - { - int j; - int i; - unsigned temp; - int cursor_row; -@@ -9078,11 +9223,11 @@ msg_pos_mode() - void - unshowmode(force) - int force; - { - /* -- * Don't delete it right now, when not redrawing or insided a mapping. -+ * Don't delete it right now, when not redrawing or inside a mapping. - */ - if (!redrawing() || (!force && char_avail() && !KeyTyped)) - redraw_cmdline = TRUE; /* delete mode later */ - else - { -@@ -9384,11 +9529,11 @@ showruler(always) - } - #endif - #if defined(FEAT_STL_OPT) && defined(FEAT_WINDOWS) - if ((*p_stl != NUL || *curwin->w_p_stl != NUL) && curwin->w_status_height) - { -- redraw_custum_statusline(curwin); -+ redraw_custom_statusline(curwin); - } - else - #endif - #ifdef FEAT_CMDL_INFO - win_redr_ruler(curwin, always); -@@ -9414,17 +9559,19 @@ showruler(always) - static void - win_redr_ruler(wp, always) - win_T *wp; - int always; - { -- char_u buffer[70]; -+#define RULER_BUF_LEN 70 -+ char_u buffer[RULER_BUF_LEN]; - int row; - int fillchar; - int attr; - int empty_line = FALSE; - colnr_T virtcol; - int i; -+ size_t len; - int o; - #ifdef FEAT_VERTSPLIT - int this_ru_col; - int off = 0; - int width = Columns; -@@ -9535,25 +9682,26 @@ win_redr_ruler(wp, always) - - /* - * Some sprintfs return the length, some return a pointer. - * To avoid portability problems we use strlen() here. - */ -- sprintf((char *)buffer, "%ld,", -+ vim_snprintf((char *)buffer, RULER_BUF_LEN, "%ld,", - (wp->w_buffer->b_ml.ml_flags & ML_EMPTY) - ? 0L - : (long)(wp->w_cursor.lnum)); -- col_print(buffer + STRLEN(buffer), -+ len = STRLEN(buffer); -+ col_print(buffer + len, RULER_BUF_LEN - len, - empty_line ? 0 : (int)wp->w_cursor.col + 1, - (int)virtcol + 1); - - /* - * Add a "50%" if there is room for it. - * On the last line, don't print in the last column (scrolls the - * screen up on some terminals). - */ - i = (int)STRLEN(buffer); -- get_rel_pos(wp, buffer + i + 1); -+ get_rel_pos(wp, buffer + i + 1, RULER_BUF_LEN - i - 1); - o = i + vim_strsize(buffer + i + 1); - #ifdef FEAT_WINDOWS - if (wp->w_status_height == 0) /* can't use last char of screen */ - #endif - ++o; -@@ -9576,11 +9724,11 @@ win_redr_ruler(wp, always) - else - #endif - buffer[i++] = fillchar; - ++o; - } -- get_rel_pos(wp, buffer + i); -+ get_rel_pos(wp, buffer + i, RULER_BUF_LEN - i); - } - /* Truncate at window boundary. */ - #ifdef FEAT_MBYTE - if (has_mbyte) - { ---- vim72.orig/src/search.c -+++ vim72/src/search.c -@@ -343,10 +343,19 @@ restore_search_patterns() - void - free_search_patterns() - { - vim_free(spats[0].pat); - vim_free(spats[1].pat); -+ -+# ifdef FEAT_RIGHTLEFT -+ if (mr_pattern_alloced) -+ { -+ vim_free(mr_pattern); -+ mr_pattern_alloced = FALSE; -+ mr_pattern = NULL; -+ } -+# endif - } - #endif - - /* - * Return TRUE when case should be ignored for search pattern "pat". -@@ -511,11 +520,10 @@ last_pat_prog(regmatch) - * - * Return FAIL (zero) for failure, non-zero for success. - * When FEAT_EVAL is defined, returns the index of the first matching - * subpattern plus one; one if there was none. - */ --/*ARGSUSED*/ - int - searchit(win, buf, pos, dir, pat, count, options, pat_use, stop_lnum, tm) - win_T *win; /* window to search in; can be NULL for a - buffer without a window! */ - buf_T *buf; -@@ -524,11 +532,11 @@ searchit(win, buf, pos, dir, pat, count, - char_u *pat; - long count; - int options; - int pat_use; /* which pattern to use when "pat" is empty */ - linenr_T stop_lnum; /* stop after this line number when != 0 */ -- proftime_T *tm; /* timeout limit or NULL */ -+ proftime_T *tm UNUSED; /* timeout limit or NULL */ - { - int found; - linenr_T lnum; /* no init to shut up Apollo cc */ - regmmatch_T regmatch; - char_u *ptr; -@@ -543,12 +551,10 @@ searchit(win, buf, pos, dir, pat, count, - long nmatched; - int submatch = 0; - int save_called_emsg = called_emsg; - #ifdef FEAT_SEARCH_EXTRA - int break_loop = FALSE; --#else --# define break_loop FALSE - #endif - - if (search_regcomp(pat, RE_SEARCH, pat_use, - (options & (SEARCH_HIS + SEARCH_KEEP)), ®match) == FAIL) - { -@@ -929,11 +935,14 @@ searchit(win, buf, pos, dir, pat, count, - * Stop the search if wrapscan isn't set, "stop_lnum" is - * specified, after an interrupt, after a match and after looping - * twice. - */ - if (!p_ws || stop_lnum != 0 || got_int || called_emsg -- || break_loop || found || loop) -+#ifdef FEAT_SEARCH_EXTRA -+ || break_loop -+#endif -+ || found || loop) - break; - - /* - * If 'wrapscan' is set we continue at the other end of the file. - * If 'shortmess' does not contain 's', we give a message. -@@ -947,11 +956,15 @@ searchit(win, buf, pos, dir, pat, count, - lnum = 1; - if (!shortmess(SHM_SEARCH) && (options & SEARCH_MSG)) - give_warning((char_u *)_(dir == BACKWARD - ? top_bot_msg : bot_top_msg), TRUE); - } -- if (got_int || called_emsg || break_loop) -+ if (got_int || called_emsg -+#ifdef FEAT_SEARCH_EXTRA -+ || break_loop -+#endif -+ ) - break; - } - while (--count > 0 && found); /* stop after count matches or no match */ - - vim_free(regmatch.regprog); -@@ -2325,12 +2338,12 @@ findmatchlimit(oap, initc, flags, maxtra - if (!cpo_bsl) - { - for (col = pos.col; check_prevcol(linep, col, '\\', &col);) - bslcnt++; - } -- /* Only accept a match when 'M' is in 'cpo' or when ecaping is -- * what we expect. */ -+ /* Only accept a match when 'M' is in 'cpo' or when escaping -+ * is what we expect. */ - if (cpo_bsl || (bslcnt & 1) == match_escaped) - { - if (c == initc) - count++; - else -@@ -4512,16 +4525,15 @@ linewhite(lnum) - #if defined(FEAT_FIND_ID) || defined(PROTO) - /* - * Find identifiers or defines in included files. - * if p_ic && (compl_cont_status & CONT_SOL) then ptr must be in lowercase. - */ --/*ARGSUSED*/ - void - find_pattern_in_path(ptr, dir, len, whole, skip_comments, - type, count, action, start_lnum, end_lnum) - char_u *ptr; /* pointer to search pattern */ -- int dir; /* direction of expansion */ -+ int dir UNUSED; /* direction of expansion */ - int len; /* length of search pattern */ - int whole; /* match whole words only */ - int skip_comments; /* don't match inside comments */ - int type; /* Type of search; are we looking for a type? - a macro? */ -@@ -4661,11 +4673,11 @@ find_pattern_in_path(ptr, dir, len, whol - action == ACTION_SHOW_ALL && files[i].matched) - { - msg_putchar('\n'); /* cursor below last one */ - if (!got_int) /* don't display if 'q' - typed at "--more--" -- mesage */ -+ message */ - { - msg_home_replace_hl(new_fname); - MSG_PUTS(_(" (includes previously listed match)")); - prev_fname = NULL; - } -@@ -4973,11 +4985,11 @@ search_line: - || (vim_strchr(p_cpo, CPO_JOINSP) == NULL - && (IObuff[i-2] == '?' - || IObuff[i-2] == '!')))) - IObuff[i++] = ' '; - } -- /* copy as much as posible of the new word */ -+ /* copy as much as possible of the new word */ - if (p - aux >= IOSIZE - i) - p = aux + IOSIZE - i - 1; - STRNCPY(IObuff + i, aux, p - aux); - i += (int)(p - aux); - reuse |= CONT_S_IPOS; -@@ -5008,11 +5020,11 @@ search_line: - if (curr_fname != prev_fname) - { - if (did_show) - msg_putchar('\n'); /* cursor below last one */ - if (!got_int) /* don't display if 'q' typed -- at "--more--" mesage */ -+ at "--more--" message */ - msg_home_replace_hl(curr_fname); - prev_fname = curr_fname; - } - did_show = TRUE; - if (!got_int) -@@ -5090,11 +5102,11 @@ search_line: - curwin->w_cursor.lnum = files[depth].lnum; - } - } - if (action != ACTION_SHOW) - { -- curwin->w_cursor.col = (colnr_T) (startp - line); -+ curwin->w_cursor.col = (colnr_T)(startp - line); - curwin->w_set_curswant = TRUE; - } - - #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX) - if (g_do_tagpreview != 0 -@@ -5117,11 +5129,12 @@ exit_matched: - if (def_regmatch.regprog == NULL - #ifdef FEAT_INS_EXPAND - && action == ACTION_EXPAND - && !(compl_cont_status & CONT_SOL) - #endif -- && *(p = startp + 1)) -+ && *startp != NUL -+ && *(p = startp + 1) != NUL) - goto search_line; - } - line_breakcheck(); - #ifdef FEAT_INS_EXPAND - if (action == ACTION_EXPAND) ---- vim72.orig/src/spell.c -+++ vim72/src/spell.c -@@ -75,11 +75,11 @@ - */ - #define RESCORE(word_score, sound_score) ((3 * word_score + sound_score) / 4) - - /* - * Do the opposite: based on a maximum end score and a known sound score, -- * compute the the maximum word score that can be used. -+ * compute the maximum word score that can be used. - */ - #define MAXSCORE(word_score, sound_score) ((4 * word_score - sound_score) / 3) - - /* - * Vim spell file format: <HEADER> -@@ -467,10 +467,11 @@ struct slang_S - int sl_compsylmax; /* COMPOUNDSYLMAX (default: MAXWLEN) */ - int sl_compoptions; /* COMP_* flags */ - garray_T sl_comppat; /* CHECKCOMPOUNDPATTERN items */ - regprog_T *sl_compprog; /* COMPOUNDRULE turned into a regexp progrm - * (NULL when no compounding) */ -+ char_u *sl_comprules; /* all COMPOUNDRULE concatenated (or NULL) */ - char_u *sl_compstartflags; /* flags for first compound word */ - char_u *sl_compallflags; /* all flags for compound words */ - char_u sl_nobreak; /* When TRUE: no spaces between words */ - char_u *sl_syllable; /* SYLLABLE repeatable chars or NULL */ - garray_T sl_syl_items; /* syllable items */ -@@ -623,11 +624,11 @@ typedef struct suggest_S - #define SUG(ga, i) (((suggest_T *)(ga).ga_data)[i]) - - /* TRUE if a word appears in the list of banned words. */ - #define WAS_BANNED(su, word) (!HASHITEM_EMPTY(hash_find(&su->su_banned, word))) - --/* Number of suggestions kept when cleaning up. we need to keep more than -+/* Number of suggestions kept when cleaning up. We need to keep more than - * what is displayed, because when rescore_suggestions() is called the score - * may change and wrong suggestions may be removed later. */ - #define SUG_CLEAN_COUNT(su) ((su)->su_maxcount < 130 ? 150 : (su)->su_maxcount + 20) - - /* Threshold for sorting and cleaning up suggestions. Don't want to keep lots -@@ -837,11 +838,14 @@ typedef struct trystate_S - static slang_T *slang_alloc __ARGS((char_u *lang)); - static void slang_free __ARGS((slang_T *lp)); - static void slang_clear __ARGS((slang_T *lp)); - static void slang_clear_sug __ARGS((slang_T *lp)); - static void find_word __ARGS((matchinf_T *mip, int mode)); -+static int match_checkcompoundpattern __ARGS((char_u *ptr, int wlen, garray_T *gap)); - static int can_compound __ARGS((slang_T *slang, char_u *word, char_u *flags)); -+static int can_be_compound __ARGS((trystate_T *sp, slang_T *slang, char_u *compflags, int flag)); -+static int match_compoundrule __ARGS((slang_T *slang, char_u *compflags)); - static int valid_word_prefix __ARGS((int totprefcnt, int arridx, int flags, char_u *word, slang_T *slang, int cond_req)); - static void find_prefix __ARGS((matchinf_T *mip, int mode)); - static int fold_more __ARGS((matchinf_T *mip)); - static int spell_valid_case __ARGS((int wordflags, int treeflags)); - static int no_spell_checking __ARGS((win_T *wp)); -@@ -944,34 +948,34 @@ static void close_spellbuf __ARGS((buf_T - * differ from what the .spl file uses. - * These must not be called with negative number! - */ - #ifndef FEAT_MBYTE - /* Non-multi-byte implementation. */ --# define SPELL_TOFOLD(c) ((c) < 256 ? spelltab.st_fold[c] : (c)) --# define SPELL_TOUPPER(c) ((c) < 256 ? spelltab.st_upper[c] : (c)) -+# define SPELL_TOFOLD(c) ((c) < 256 ? (int)spelltab.st_fold[c] : (c)) -+# define SPELL_TOUPPER(c) ((c) < 256 ? (int)spelltab.st_upper[c] : (c)) - # define SPELL_ISUPPER(c) ((c) < 256 ? spelltab.st_isu[c] : FALSE) - #else - # if defined(HAVE_WCHAR_H) - # include <wchar.h> /* for towupper() and towlower() */ - # endif - /* Multi-byte implementation. For Unicode we can call utf_*(), but don't do - * that for ASCII, because we don't want to use 'casemap' here. Otherwise use - * the "w" library function for characters above 255 if available. */ - # ifdef HAVE_TOWLOWER - # define SPELL_TOFOLD(c) (enc_utf8 && (c) >= 128 ? utf_fold(c) \ -- : (c) < 256 ? spelltab.st_fold[c] : towlower(c)) -+ : (c) < 256 ? (int)spelltab.st_fold[c] : (int)towlower(c)) - # else - # define SPELL_TOFOLD(c) (enc_utf8 && (c) >= 128 ? utf_fold(c) \ -- : (c) < 256 ? spelltab.st_fold[c] : (c)) -+ : (c) < 256 ? (int)spelltab.st_fold[c] : (c)) - # endif - - # ifdef HAVE_TOWUPPER - # define SPELL_TOUPPER(c) (enc_utf8 && (c) >= 128 ? utf_toupper(c) \ -- : (c) < 256 ? spelltab.st_upper[c] : towupper(c)) -+ : (c) < 256 ? (int)spelltab.st_upper[c] : (int)towupper(c)) - # else - # define SPELL_TOUPPER(c) (enc_utf8 && (c) >= 128 ? utf_toupper(c) \ -- : (c) < 256 ? spelltab.st_upper[c] : (c)) -+ : (c) < 256 ? (int)spelltab.st_upper[c] : (c)) - # endif - - # ifdef HAVE_ISWUPPER - # define SPELL_ISUPPER(c) (enc_utf8 && (c) >= 128 ? utf_isupper(c) \ - : (c) < 256 ? spelltab.st_isu[c] : iswupper(c)) -@@ -1517,10 +1521,15 @@ find_word(mip, mode) - ? slang->sl_compstartflags - : slang->sl_compallflags, - ((unsigned)flags >> 24))) - continue; - -+ /* If there is a match with a CHECKCOMPOUNDPATTERN rule -+ * discard the compound word. */ -+ if (match_checkcompoundpattern(ptr, wlen, &slang->sl_comppat)) -+ continue; -+ - if (mode == FIND_COMPOUND) - { - int capflags; - - /* Need to check the caps type of the appended compound -@@ -1575,10 +1584,15 @@ find_word(mip, mode) - vim_strncpy(fword, ptr, endlen[endidxcnt]); - } - if (!can_compound(slang, fword, mip->mi_compflags)) - continue; - } -+ else if (slang->sl_comprules != NULL -+ && !match_compoundrule(slang, mip->mi_compflags)) -+ /* The compound flags collected so far do not match any -+ * COMPOUNDRULE, discard the compounded word. */ -+ continue; - } - - /* Check NEEDCOMPOUND: can't use word without compounding. */ - else if (flags & WF_NEEDCOMP) - continue; -@@ -1725,10 +1739,43 @@ find_word(mip, mode) - break; - } - } - - /* -+ * Return TRUE if there is a match between the word ptr[wlen] and -+ * CHECKCOMPOUNDPATTERN rules, assuming that we will concatenate with another -+ * word. -+ * A match means that the first part of CHECKCOMPOUNDPATTERN matches at the -+ * end of ptr[wlen] and the second part matches after it. -+ */ -+ static int -+match_checkcompoundpattern(ptr, wlen, gap) -+ char_u *ptr; -+ int wlen; -+ garray_T *gap; /* &sl_comppat */ -+{ -+ int i; -+ char_u *p; -+ int len; -+ -+ for (i = 0; i + 1 < gap->ga_len; i += 2) -+ { -+ p = ((char_u **)gap->ga_data)[i + 1]; -+ if (STRNCMP(ptr + wlen, p, STRLEN(p)) == 0) -+ { -+ /* Second part matches at start of following compound word, now -+ * check if first part matches at end of previous word. */ -+ p = ((char_u **)gap->ga_data)[i]; -+ len = (int)STRLEN(p); -+ if (len <= wlen && STRNCMP(ptr + wlen - len, p, len) == 0) -+ return TRUE; -+ } -+ } -+ return FALSE; -+} -+ -+/* - * Return TRUE if "flags" is a valid sequence of compound flags and "word" - * does not have too many syllables. - */ - static int - can_compound(slang, word, flags) -@@ -1771,10 +1818,102 @@ can_compound(slang, word, flags) - return (int)STRLEN(flags) < slang->sl_compmax; - return TRUE; - } - - /* -+ * Return TRUE when the sequence of flags in "compflags" plus "flag" can -+ * possibly form a valid compounded word. This also checks the COMPOUNDRULE -+ * lines if they don't contain wildcards. -+ */ -+ static int -+can_be_compound(sp, slang, compflags, flag) -+ trystate_T *sp; -+ slang_T *slang; -+ char_u *compflags; -+ int flag; -+{ -+ /* If the flag doesn't appear in sl_compstartflags or sl_compallflags -+ * then it can't possibly compound. */ -+ if (!byte_in_str(sp->ts_complen == sp->ts_compsplit -+ ? slang->sl_compstartflags : slang->sl_compallflags, flag)) -+ return FALSE; -+ -+ /* If there are no wildcards, we can check if the flags collected so far -+ * possibly can form a match with COMPOUNDRULE patterns. This only -+ * makes sense when we have two or more words. */ -+ if (slang->sl_comprules != NULL && sp->ts_complen > sp->ts_compsplit) -+ { -+ int v; -+ -+ compflags[sp->ts_complen] = flag; -+ compflags[sp->ts_complen + 1] = NUL; -+ v = match_compoundrule(slang, compflags + sp->ts_compsplit); -+ compflags[sp->ts_complen] = NUL; -+ return v; -+ } -+ -+ return TRUE; -+} -+ -+ -+/* -+ * Return TRUE if the compound flags in compflags[] match the start of any -+ * compound rule. This is used to stop trying a compound if the flags -+ * collected so far can't possibly match any compound rule. -+ * Caller must check that slang->sl_comprules is not NULL. -+ */ -+ static int -+match_compoundrule(slang, compflags) -+ slang_T *slang; -+ char_u *compflags; -+{ -+ char_u *p; -+ int i; -+ int c; -+ -+ /* loop over all the COMPOUNDRULE entries */ -+ for (p = slang->sl_comprules; *p != NUL; ++p) -+ { -+ /* loop over the flags in the compound word we have made, match -+ * them against the current rule entry */ -+ for (i = 0; ; ++i) -+ { -+ c = compflags[i]; -+ if (c == NUL) -+ /* found a rule that matches for the flags we have so far */ -+ return TRUE; -+ if (*p == '/' || *p == NUL) -+ break; /* end of rule, it's too short */ -+ if (*p == '[') -+ { -+ int match = FALSE; -+ -+ /* compare against all the flags in [] */ -+ ++p; -+ while (*p != ']' && *p != NUL) -+ if (*p++ == c) -+ match = TRUE; -+ if (!match) -+ break; /* none matches */ -+ } -+ else if (*p != c) -+ break; /* flag of word doesn't match flag in pattern */ -+ ++p; -+ } -+ -+ /* Skip to the next "/", where the next pattern starts. */ -+ p = vim_strchr(p, '/'); -+ if (p == NULL) -+ break; -+ } -+ -+ /* Checked all the rules and none of them match the flags, so there -+ * can't possibly be a compound starting with these flags. */ -+ return FALSE; -+} -+ -+/* - * Return non-zero if the prefix indicated by "arridx" matches with the prefix - * ID in "flags" for the word "word". - * The WF_RAREPFX flag is included in the return value for a rare prefix. - */ - static int -@@ -2235,11 +2374,11 @@ spell_move_to(wp, dir, allwords, curline - give_warning((char_u *)_(bot_top_msg), TRUE); - } - - /* If we are back at the starting line and there is no match then - * give up. */ -- if (lnum == wp->w_cursor.lnum && !found_one) -+ if (lnum == wp->w_cursor.lnum && (!found_one || wrapped)) - break; - - /* Skip the characters at the start of the next line that were - * included in a match crossing line boundaries. */ - if (attr == HLF_COUNT) -@@ -2511,13 +2650,15 @@ slang_clear(lp) - - vim_free(lp->sl_midword); - lp->sl_midword = NULL; - - vim_free(lp->sl_compprog); -+ vim_free(lp->sl_comprules); - vim_free(lp->sl_compstartflags); - vim_free(lp->sl_compallflags); - lp->sl_compprog = NULL; -+ lp->sl_comprules = NULL; - lp->sl_compstartflags = NULL; - lp->sl_compallflags = NULL; - - vim_free(lp->sl_syllable); - lp->sl_syllable = NULL; -@@ -3458,10 +3599,11 @@ read_compound(fd, slang, len) - int atstart; - char_u *pat; - char_u *pp; - char_u *cp; - char_u *ap; -+ char_u *crp; - int cnt; - garray_T *gap; - - if (todo < 2) - return SP_FORMERROR; /* need at least two bytes */ -@@ -3543,10 +3685,16 @@ read_compound(fd, slang, len) - return SP_OTHERERROR; - } - slang->sl_compallflags = ap; - *ap = NUL; - -+ /* And a list of all patterns in their original form, for checking whether -+ * compounding may work in match_compoundrule(). This is freed when we -+ * encounter a wildcard, the check doesn't work then. */ -+ crp = alloc(todo + 1); -+ slang->sl_comprules = crp; -+ - pp = pat; - *pp++ = '^'; - *pp++ = '\\'; - *pp++ = '('; - -@@ -3585,10 +3733,24 @@ read_compound(fd, slang, len) - } - if (atstart == 1) - atstart = 0; - } - } -+ -+ /* Copy flag to "sl_comprules", unless we run into a wildcard. */ -+ if (crp != NULL) -+ { -+ if (c == '+' || c == '*') -+ { -+ vim_free(slang->sl_comprules); -+ slang->sl_comprules = NULL; -+ crp = NULL; -+ } -+ else -+ *crp++ = c; -+ } -+ - if (c == '/') /* slash separates two items */ - { - *pp++ = '\\'; - *pp++ = '|'; - atstart = 1; -@@ -3609,10 +3771,13 @@ read_compound(fd, slang, len) - *pp++ = '\\'; - *pp++ = ')'; - *pp++ = '$'; - *pp = NUL; - -+ if (crp != NULL) -+ *crp = NUL; -+ - slang->sl_compprog = vim_regcomp(pat, RE_MAGIC + RE_STRING + RE_STRICT); - vim_free(pat); - if (slang->sl_compprog == NULL) - return SP_FORMERROR; - -@@ -4789,17 +4954,20 @@ typedef struct compitem_S - - /* - * Structure that is used to store the items in the word tree. This avoids - * the need to keep track of each allocated thing, everything is freed all at - * once after ":mkspell" is done. -+ * Note: "sb_next" must be just before "sb_data" to make sure the alignment of -+ * "sb_data" is correct for systems where pointers must be aligned on -+ * pointer-size boundaries and sizeof(pointer) > sizeof(int) (e.g., Sparc). - */ - #define SBLOCKSIZE 16000 /* size of sb_data */ - typedef struct sblock_S sblock_T; - struct sblock_S - { -- sblock_T *sb_next; /* next block in list */ - int sb_used; /* nr of bytes already in use */ -+ sblock_T *sb_next; /* next block in list */ - char_u sb_data[1]; /* data, actually longer */ - }; - - /* - * A node in the tree. -@@ -4913,10 +5081,11 @@ typedef struct spellinfo_S - int si_newprefID; /* current value for ah_newID */ - int si_newcompID; /* current value for compound ID */ - } spellinfo_T; - - static afffile_T *spell_read_aff __ARGS((spellinfo_T *spin, char_u *fname)); -+static int is_aff_rule __ARGS((char_u **items, int itemcnt, char *rulename, int mincount)); - static void aff_process_flags __ARGS((afffile_T *affile, affentry_T *entry)); - static int spell_info_item __ARGS((char_u *s)); - static unsigned affitem2flag __ARGS((int flagtype, char_u *item, char_u *fname, int lnum)); - static unsigned get_affitem __ARGS((int flagtype, char_u **pp)); - static void process_compflags __ARGS((spellinfo_T *spin, afffile_T *aff, char_u *compflags)); -@@ -4948,11 +5117,11 @@ static void wordtree_compress __ARGS((sp - static int node_compress __ARGS((spellinfo_T *spin, wordnode_T *node, hashtab_T *ht, int *tot)); - static int node_equal __ARGS((wordnode_T *n1, wordnode_T *n2)); - static void put_sugtime __ARGS((spellinfo_T *spin, FILE *fd)); - static int write_vim_spell __ARGS((spellinfo_T *spin, char_u *fname)); - static void clear_node __ARGS((wordnode_T *node)); --static int put_node __ARGS((FILE *fd, wordnode_T *node, int index, int regionmask, int prefixtree)); -+static int put_node __ARGS((FILE *fd, wordnode_T *node, int idx, int regionmask, int prefixtree)); - static void spell_make_sugfile __ARGS((spellinfo_T *spin, char_u *wfname)); - static int sug_filltree __ARGS((spellinfo_T *spin, slang_T *slang)); - static int sug_maketable __ARGS((spellinfo_T *spin)); - static int sug_filltable __ARGS((spellinfo_T *spin, wordnode_T *node, int startwordnr, garray_T *gap)); - static int offset2bytes __ARGS((int nr, char_u *buf)); -@@ -5221,12 +5390,11 @@ spell_read_aff(spin, fname) - } - - /* Handle non-empty lines. */ - if (itemcnt > 0) - { -- if (STRCMP(items[0], "SET") == 0 && itemcnt == 2 -- && aff->af_enc == NULL) -+ if (is_aff_rule(items, itemcnt, "SET", 2) && aff->af_enc == NULL) - { - #ifdef FEAT_MBYTE - /* Setup for conversion from "ENC" to 'encoding'. */ - aff->af_enc = enc_canonize(items[1]); - if (aff->af_enc != NULL && !spin->si_ascii -@@ -5237,11 +5405,11 @@ spell_read_aff(spin, fname) - spin->si_conv.vc_fail = TRUE; - #else - smsg((char_u *)_("Conversion in %s not supported"), fname); - #endif - } -- else if (STRCMP(items[0], "FLAG") == 0 && itemcnt == 2 -+ else if (is_aff_rule(items, itemcnt, "FLAG", 2) - && aff->af_flagtype == AFT_CHAR) - { - if (STRCMP(items[1], "long") == 0) - aff->af_flagtype = AFT_LONG; - else if (STRCMP(items[1], "num") == 0) -@@ -5282,90 +5450,92 @@ spell_read_aff(spin, fname) - STRCAT(p, " "); - STRCAT(p, items[1]); - spin->si_info = p; - } - } -- else if (STRCMP(items[0], "MIDWORD") == 0 && itemcnt == 2 -+ else if (is_aff_rule(items, itemcnt, "MIDWORD", 2) - && midword == NULL) - { - midword = getroom_save(spin, items[1]); - } -- else if (STRCMP(items[0], "TRY") == 0 && itemcnt == 2) -+ else if (is_aff_rule(items, itemcnt, "TRY", 2)) - { - /* ignored, we look in the tree for what chars may appear */ - } - /* TODO: remove "RAR" later */ -- else if ((STRCMP(items[0], "RAR") == 0 -- || STRCMP(items[0], "RARE") == 0) && itemcnt == 2 -- && aff->af_rare == 0) -+ else if ((is_aff_rule(items, itemcnt, "RAR", 2) -+ || is_aff_rule(items, itemcnt, "RARE", 2)) -+ && aff->af_rare == 0) - { - aff->af_rare = affitem2flag(aff->af_flagtype, items[1], - fname, lnum); - } - /* TODO: remove "KEP" later */ -- else if ((STRCMP(items[0], "KEP") == 0 -- || STRCMP(items[0], "KEEPCASE") == 0) && itemcnt == 2 -+ else if ((is_aff_rule(items, itemcnt, "KEP", 2) -+ || is_aff_rule(items, itemcnt, "KEEPCASE", 2)) - && aff->af_keepcase == 0) - { - aff->af_keepcase = affitem2flag(aff->af_flagtype, items[1], - fname, lnum); - } -- else if (STRCMP(items[0], "BAD") == 0 && itemcnt == 2 -- && aff->af_bad == 0) -+ else if ((is_aff_rule(items, itemcnt, "BAD", 2) -+ || is_aff_rule(items, itemcnt, "FORBIDDENWORD", 2)) -+ && aff->af_bad == 0) - { - aff->af_bad = affitem2flag(aff->af_flagtype, items[1], - fname, lnum); - } -- else if (STRCMP(items[0], "NEEDAFFIX") == 0 && itemcnt == 2 -+ else if (is_aff_rule(items, itemcnt, "NEEDAFFIX", 2) - && aff->af_needaffix == 0) - { - aff->af_needaffix = affitem2flag(aff->af_flagtype, items[1], - fname, lnum); - } -- else if (STRCMP(items[0], "CIRCUMFIX") == 0 && itemcnt == 2 -+ else if (is_aff_rule(items, itemcnt, "CIRCUMFIX", 2) - && aff->af_circumfix == 0) - { - aff->af_circumfix = affitem2flag(aff->af_flagtype, items[1], - fname, lnum); - } -- else if (STRCMP(items[0], "NOSUGGEST") == 0 && itemcnt == 2 -+ else if (is_aff_rule(items, itemcnt, "NOSUGGEST", 2) - && aff->af_nosuggest == 0) - { - aff->af_nosuggest = affitem2flag(aff->af_flagtype, items[1], - fname, lnum); - } -- else if (STRCMP(items[0], "NEEDCOMPOUND") == 0 && itemcnt == 2 -+ else if ((is_aff_rule(items, itemcnt, "NEEDCOMPOUND", 2) -+ || is_aff_rule(items, itemcnt, "ONLYINCOMPOUND", 2)) - && aff->af_needcomp == 0) - { - aff->af_needcomp = affitem2flag(aff->af_flagtype, items[1], - fname, lnum); - } -- else if (STRCMP(items[0], "COMPOUNDROOT") == 0 && itemcnt == 2 -+ else if (is_aff_rule(items, itemcnt, "COMPOUNDROOT", 2) - && aff->af_comproot == 0) - { - aff->af_comproot = affitem2flag(aff->af_flagtype, items[1], - fname, lnum); - } -- else if (STRCMP(items[0], "COMPOUNDFORBIDFLAG") == 0 -- && itemcnt == 2 && aff->af_compforbid == 0) -+ else if (is_aff_rule(items, itemcnt, "COMPOUNDFORBIDFLAG", 2) -+ && aff->af_compforbid == 0) - { - aff->af_compforbid = affitem2flag(aff->af_flagtype, items[1], - fname, lnum); - if (aff->af_pref.ht_used > 0) - smsg((char_u *)_("Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line %d"), - fname, lnum); - } -- else if (STRCMP(items[0], "COMPOUNDPERMITFLAG") == 0 -- && itemcnt == 2 && aff->af_comppermit == 0) -+ else if (is_aff_rule(items, itemcnt, "COMPOUNDPERMITFLAG", 2) -+ && aff->af_comppermit == 0) - { - aff->af_comppermit = affitem2flag(aff->af_flagtype, items[1], - fname, lnum); - if (aff->af_pref.ht_used > 0) - smsg((char_u *)_("Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line %d"), - fname, lnum); - } -- else if (STRCMP(items[0], "COMPOUNDFLAG") == 0 && itemcnt == 2 -+ else if (is_aff_rule(items, itemcnt, "COMPOUNDFLAG", 2) - && compflags == NULL) - { - /* Turn flag "c" into COMPOUNDRULE compatible string "c+", - * "Na" into "Na+", "1234" into "1234+". */ - p = getroom(spin, STRLEN(items[1]) + 2, FALSE); -@@ -5374,11 +5544,19 @@ spell_read_aff(spin, fname) - STRCPY(p, items[1]); - STRCAT(p, "+"); - compflags = p; - } - } -- else if (STRCMP(items[0], "COMPOUNDRULE") == 0 && itemcnt == 2) -+ else if (is_aff_rule(items, itemcnt, "COMPOUNDRULES", 2)) -+ { -+ /* We don't use the count, but do check that it's a number and -+ * not COMPOUNDRULE mistyped. */ -+ if (atoi((char *)items[1]) == 0) -+ smsg((char_u *)_("Wrong COMPOUNDRULES value in %s line %d: %s"), -+ fname, lnum, items[1]); -+ } -+ else if (is_aff_rule(items, itemcnt, "COMPOUNDRULE", 2)) - { - /* Concatenate this string to previously defined ones, using a - * slash to separate them. */ - l = (int)STRLEN(items[1]) + 1; - if (compflags != NULL) -@@ -5393,60 +5571,57 @@ spell_read_aff(spin, fname) - } - STRCAT(p, items[1]); - compflags = p; - } - } -- else if (STRCMP(items[0], "COMPOUNDWORDMAX") == 0 && itemcnt == 2 -+ else if (is_aff_rule(items, itemcnt, "COMPOUNDWORDMAX", 2) - && compmax == 0) - { - compmax = atoi((char *)items[1]); - if (compmax == 0) - smsg((char_u *)_("Wrong COMPOUNDWORDMAX value in %s line %d: %s"), - fname, lnum, items[1]); - } -- else if (STRCMP(items[0], "COMPOUNDMIN") == 0 && itemcnt == 2 -+ else if (is_aff_rule(items, itemcnt, "COMPOUNDMIN", 2) - && compminlen == 0) - { - compminlen = atoi((char *)items[1]); - if (compminlen == 0) - smsg((char_u *)_("Wrong COMPOUNDMIN value in %s line %d: %s"), - fname, lnum, items[1]); - } -- else if (STRCMP(items[0], "COMPOUNDSYLMAX") == 0 && itemcnt == 2 -+ else if (is_aff_rule(items, itemcnt, "COMPOUNDSYLMAX", 2) - && compsylmax == 0) - { - compsylmax = atoi((char *)items[1]); - if (compsylmax == 0) - smsg((char_u *)_("Wrong COMPOUNDSYLMAX value in %s line %d: %s"), - fname, lnum, items[1]); - } -- else if (STRCMP(items[0], "CHECKCOMPOUNDDUP") == 0 && itemcnt == 1) -+ else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDDUP", 1)) - { - compoptions |= COMP_CHECKDUP; - } -- else if (STRCMP(items[0], "CHECKCOMPOUNDREP") == 0 && itemcnt == 1) -+ else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDREP", 1)) - { - compoptions |= COMP_CHECKREP; - } -- else if (STRCMP(items[0], "CHECKCOMPOUNDCASE") == 0 && itemcnt == 1) -+ else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDCASE", 1)) - { - compoptions |= COMP_CHECKCASE; - } -- else if (STRCMP(items[0], "CHECKCOMPOUNDTRIPLE") == 0 -- && itemcnt == 1) -+ else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDTRIPLE", 1)) - { - compoptions |= COMP_CHECKTRIPLE; - } -- else if (STRCMP(items[0], "CHECKCOMPOUNDPATTERN") == 0 -- && itemcnt == 2) -+ else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDPATTERN", 2)) - { - if (atoi((char *)items[1]) == 0) - smsg((char_u *)_("Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"), - fname, lnum, items[1]); - } -- else if (STRCMP(items[0], "CHECKCOMPOUNDPATTERN") == 0 -- && itemcnt == 3) -+ else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDPATTERN", 3)) - { - garray_T *gap = &spin->si_comppat; - int i; - - /* Only add the couple if it isn't already there. */ -@@ -5461,28 +5636,28 @@ spell_read_aff(spin, fname) - = getroom_save(spin, items[1]); - ((char_u **)(gap->ga_data))[gap->ga_len++] - = getroom_save(spin, items[2]); - } - } -- else if (STRCMP(items[0], "SYLLABLE") == 0 && itemcnt == 2 -+ else if (is_aff_rule(items, itemcnt, "SYLLABLE", 2) - && syllable == NULL) - { - syllable = getroom_save(spin, items[1]); - } -- else if (STRCMP(items[0], "NOBREAK") == 0 && itemcnt == 1) -+ else if (is_aff_rule(items, itemcnt, "NOBREAK", 1)) - { - spin->si_nobreak = TRUE; - } -- else if (STRCMP(items[0], "NOSPLITSUGS") == 0 && itemcnt == 1) -+ else if (is_aff_rule(items, itemcnt, "NOSPLITSUGS", 1)) - { - spin->si_nosplitsugs = TRUE; - } -- else if (STRCMP(items[0], "NOSUGFILE") == 0 && itemcnt == 1) -+ else if (is_aff_rule(items, itemcnt, "NOSUGFILE", 1)) - { - spin->si_nosugfile = TRUE; - } -- else if (STRCMP(items[0], "PFXPOSTPONE") == 0 && itemcnt == 1) -+ else if (is_aff_rule(items, itemcnt, "PFXPOSTPONE", 1)) - { - aff->af_pfxpostpone = TRUE; - } - else if ((STRCMP(items[0], "PFX") == 0 - || STRCMP(items[0], "SFX") == 0) -@@ -5769,28 +5944,24 @@ spell_read_aff(spin, fname) - cur_aff->ah_newID = 0; - } - } - } - } -- else if (STRCMP(items[0], "FOL") == 0 && itemcnt == 2 -- && fol == NULL) -+ else if (is_aff_rule(items, itemcnt, "FOL", 2) && fol == NULL) - { - fol = vim_strsave(items[1]); - } -- else if (STRCMP(items[0], "LOW") == 0 && itemcnt == 2 -- && low == NULL) -+ else if (is_aff_rule(items, itemcnt, "LOW", 2) && low == NULL) - { - low = vim_strsave(items[1]); - } -- else if (STRCMP(items[0], "UPP") == 0 && itemcnt == 2 -- && upp == NULL) -+ else if (is_aff_rule(items, itemcnt, "UPP", 2) && upp == NULL) - { - upp = vim_strsave(items[1]); - } -- else if ((STRCMP(items[0], "REP") == 0 -- || STRCMP(items[0], "REPSAL") == 0) -- && itemcnt == 2) -+ else if (is_aff_rule(items, itemcnt, "REP", 2) -+ || is_aff_rule(items, itemcnt, "REPSAL", 2)) - { - /* Ignore REP/REPSAL count */; - if (!isdigit(*items[1])) - smsg((char_u *)_("Expected REP(SAL) count in %s line %d"), - fname, lnum); -@@ -5817,11 +5988,11 @@ spell_read_aff(spin, fname) - add_fromto(spin, items[0][3] == 'S' - ? &spin->si_repsal - : &spin->si_rep, items[1], items[2]); - } - } -- else if (STRCMP(items[0], "MAP") == 0 && itemcnt == 2) -+ else if (is_aff_rule(items, itemcnt, "MAP", 2)) - { - /* MAP item or count */ - if (!found_map) - { - /* First line contains the count. */ -@@ -5854,13 +6025,12 @@ spell_read_aff(spin, fname) - * slashes. */ - ga_concat(&spin->si_map, items[1]); - ga_append(&spin->si_map, '/'); - } - } -- /* Accept "SAL from to" and "SAL from to # comment". */ -- else if (STRCMP(items[0], "SAL") == 0 -- && (itemcnt == 3 || (itemcnt > 3 && items[3][0] == '#'))) -+ /* Accept "SAL from to" and "SAL from to #comment". */ -+ else if (is_aff_rule(items, itemcnt, "SAL", 3)) - { - if (do_sal) - { - /* SAL item (sounds-a-like) - * Either one of the known keys or a from-to pair. */ -@@ -5875,16 +6045,16 @@ spell_read_aff(spin, fname) - add_fromto(spin, &spin->si_sal, items[1], - STRCMP(items[2], "_") == 0 ? (char_u *)"" - : items[2]); - } - } -- else if (STRCMP(items[0], "SOFOFROM") == 0 && itemcnt == 2 -+ else if (is_aff_rule(items, itemcnt, "SOFOFROM", 2) - && sofofrom == NULL) - { - sofofrom = getroom_save(spin, items[1]); - } -- else if (STRCMP(items[0], "SOFOTO") == 0 && itemcnt == 2 -+ else if (is_aff_rule(items, itemcnt, "SOFOTO", 2) - && sofoto == NULL) - { - sofoto = getroom_save(spin, items[1]); - } - else if (STRCMP(items[0], "COMMON") == 0) -@@ -5978,11 +6148,11 @@ spell_read_aff(spin, fname) - if (spin->si_newcompID == 127 || spin->si_newcompID == 255) - MSG(_("Too many postponed prefixes")); - else if (spin->si_newprefID == 0 || spin->si_newprefID == 127) - MSG(_("Too many compound flags")); - else -- MSG(_("Too many posponed prefixes and/or compound flags")); -+ MSG(_("Too many postponed prefixes and/or compound flags")); - } - - if (syllable != NULL) - { - aff_check_string(spin->si_syllable, syllable, "SYLLABLE"); -@@ -6015,10 +6185,26 @@ spell_read_aff(spin, fname) - fclose(fd); - return aff; - } - - /* -+ * Return TRUE when items[0] equals "rulename", there are "mincount" items or -+ * a comment is following after item "mincount". -+ */ -+ static int -+is_aff_rule(items, itemcnt, rulename, mincount) -+ char_u **items; -+ int itemcnt; -+ char *rulename; -+ int mincount; -+{ -+ return (STRCMP(items[0], rulename) == 0 -+ && (itemcnt == mincount -+ || (itemcnt > mincount && items[mincount][0] == '#'))); -+} -+ -+/* - * For affix "entry" move COMPOUNDFORBIDFLAG and COMPOUNDPERMITFLAG from - * ae_flags to ae_comppermit and ae_compforbid. - */ - static void - aff_process_flags(affile, entry) -@@ -7864,11 +8050,11 @@ put_sugtime(spin, fd) - int i; - - /* time_t can be up to 8 bytes in size, more than long_u, thus we - * can't use put_bytes() here. */ - for (i = 7; i >= 0; --i) -- if (i + 1 > sizeof(time_t)) -+ if (i + 1 > (int)sizeof(time_t)) - /* ">>" doesn't work well when shifting more bits than avail */ - putc(0, fd); - else - { - c = (unsigned)spin->si_sugtime >> (i * 8); -@@ -7924,25 +8110,27 @@ write_vim_spell(spin, fname) - garray_T *gap; - fromto_T *ftp; - char_u *p; - int rr; - int retval = OK; -+ size_t fwv = 1; /* collect return value of fwrite() to avoid -+ warnings from picky compiler */ - - fd = mch_fopen((char *)fname, "w"); - if (fd == NULL) - { - EMSG2(_(e_notopen), fname); - return FAIL; - } - - /* <HEADER>: <fileID> <versionnr> */ - /* <fileID> */ -- if (fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, (size_t)1, fd) != 1) -- { -- EMSG(_(e_write)); -- retval = FAIL; -- } -+ fwv &= fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, (size_t)1, fd); -+ if (fwv != (size_t)1) -+ /* Catch first write error, don't try writing more. */ -+ goto theend; -+ - putc(VIMSPELLVERSION, fd); /* <versionnr> */ - - /* - * <SECTIONS>: <section> ... <sectionend> - */ -@@ -7953,22 +8141,22 @@ write_vim_spell(spin, fname) - putc(SN_INFO, fd); /* <sectionID> */ - putc(0, fd); /* <sectionflags> */ - - i = (int)STRLEN(spin->si_info); - put_bytes(fd, (long_u)i, 4); /* <sectionlen> */ -- fwrite(spin->si_info, (size_t)i, (size_t)1, fd); /* <infotext> */ -+ fwv &= fwrite(spin->si_info, (size_t)i, (size_t)1, fd); /* <infotext> */ - } - - /* SN_REGION: <regionname> ... - * Write the region names only if there is more than one. */ - if (spin->si_region_count > 1) - { - putc(SN_REGION, fd); /* <sectionID> */ - putc(SNF_REQUIRED, fd); /* <sectionflags> */ - l = spin->si_region_count * 2; - put_bytes(fd, (long_u)l, 4); /* <sectionlen> */ -- fwrite(spin->si_region_name, (size_t)l, (size_t)1, fd); -+ fwv &= fwrite(spin->si_region_name, (size_t)l, (size_t)1, fd); - /* <regionname> ... */ - regionmask = (1 << spin->si_region_count) - 1; - } - else - regionmask = 0; -@@ -8014,22 +8202,23 @@ write_vim_spell(spin, fname) - flags |= CF_UPPER; - fputc(flags, fd); /* <charflags> */ - } - - put_bytes(fd, (long_u)l, 2); /* <folcharslen> */ -- fwrite(folchars, (size_t)l, (size_t)1, fd); /* <folchars> */ -+ fwv &= fwrite(folchars, (size_t)l, (size_t)1, fd); /* <folchars> */ - } - - /* SN_MIDWORD: <midword> */ - if (spin->si_midword != NULL) - { - putc(SN_MIDWORD, fd); /* <sectionID> */ - putc(SNF_REQUIRED, fd); /* <sectionflags> */ - - i = (int)STRLEN(spin->si_midword); - put_bytes(fd, (long_u)i, 4); /* <sectionlen> */ -- fwrite(spin->si_midword, (size_t)i, (size_t)1, fd); /* <midword> */ -+ fwv &= fwrite(spin->si_midword, (size_t)i, (size_t)1, fd); -+ /* <midword> */ - } - - /* SN_PREFCOND: <prefcondcnt> <prefcond> ... */ - if (spin->si_prefcond.ga_len > 0) - { -@@ -8111,11 +8300,12 @@ write_vim_spell(spin, fname) - for (rr = 1; rr <= 2; ++rr) - { - p = rr == 1 ? ftp->ft_from : ftp->ft_to; - l = (int)STRLEN(p); - putc(l, fd); -- fwrite(p, l, (size_t)1, fd); -+ if (l > 0) -+ fwv &= fwrite(p, l, (size_t)1, fd); - } - } - - } - -@@ -8129,15 +8319,15 @@ write_vim_spell(spin, fname) - l = (int)STRLEN(spin->si_sofofr); - put_bytes(fd, (long_u)(l + STRLEN(spin->si_sofoto) + 4), 4); - /* <sectionlen> */ - - put_bytes(fd, (long_u)l, 2); /* <sofofromlen> */ -- fwrite(spin->si_sofofr, l, (size_t)1, fd); /* <sofofrom> */ -+ fwv &= fwrite(spin->si_sofofr, l, (size_t)1, fd); /* <sofofrom> */ - - l = (int)STRLEN(spin->si_sofoto); - put_bytes(fd, (long_u)l, 2); /* <sofotolen> */ -- fwrite(spin->si_sofoto, l, (size_t)1, fd); /* <sofoto> */ -+ fwv &= fwrite(spin->si_sofoto, l, (size_t)1, fd); /* <sofoto> */ - } - - /* SN_WORDS: <word> ... - * This is for making suggestions, section is not required. */ - if (spin->si_commonwords.ht_used > 0) -@@ -8158,11 +8348,11 @@ write_vim_spell(spin, fname) - if (!HASHITEM_EMPTY(hi)) - { - l = (int)STRLEN(hi->hi_key) + 1; - len += l; - if (round == 2) /* <word> */ -- fwrite(hi->hi_key, (size_t)l, (size_t)1, fd); -+ fwv &= fwrite(hi->hi_key, (size_t)l, (size_t)1, fd); - --todo; - } - if (round == 1) - put_bytes(fd, (long_u)len, 4); /* <sectionlen> */ - } -@@ -8174,11 +8364,11 @@ write_vim_spell(spin, fname) - { - putc(SN_MAP, fd); /* <sectionID> */ - putc(0, fd); /* <sectionflags> */ - l = spin->si_map.ga_len; - put_bytes(fd, (long_u)l, 4); /* <sectionlen> */ -- fwrite(spin->si_map.ga_data, (size_t)l, (size_t)1, fd); -+ fwv &= fwrite(spin->si_map.ga_data, (size_t)l, (size_t)1, fd); - /* <mapstr> */ - } - - /* SN_SUGFILE: <timestamp> - * This is used to notify that a .sug file may be available and at the -@@ -8230,14 +8420,15 @@ write_vim_spell(spin, fname) - /* <comppatcount> */ - for (i = 0; i < spin->si_comppat.ga_len; ++i) - { - p = ((char_u **)(spin->si_comppat.ga_data))[i]; - putc((int)STRLEN(p), fd); /* <comppatlen> */ -- fwrite(p, (size_t)STRLEN(p), (size_t)1, fd);/* <comppattext> */ -+ fwv &= fwrite(p, (size_t)STRLEN(p), (size_t)1, fd); -+ /* <comppattext> */ - } - /* <compflags> */ -- fwrite(spin->si_compflags, (size_t)STRLEN(spin->si_compflags), -+ fwv &= fwrite(spin->si_compflags, (size_t)STRLEN(spin->si_compflags), - (size_t)1, fd); - } - - /* SN_NOBREAK: NOBREAK flag */ - if (spin->si_nobreak) -@@ -8257,11 +8448,12 @@ write_vim_spell(spin, fname) - putc(SN_SYLLABLE, fd); /* <sectionID> */ - putc(0, fd); /* <sectionflags> */ - - l = (int)STRLEN(spin->si_syllable); - put_bytes(fd, (long_u)l, 4); /* <sectionlen> */ -- fwrite(spin->si_syllable, (size_t)l, (size_t)1, fd); /* <syllable> */ -+ fwv &= fwrite(spin->si_syllable, (size_t)l, (size_t)1, fd); -+ /* <syllable> */ - } - - /* end of <SECTIONS> */ - putc(SN_END, fd); /* <sectionend> */ - -@@ -8293,17 +8485,22 @@ write_vim_spell(spin, fname) - - /* Write the nodes. */ - (void)put_node(fd, tree, 0, regionmask, round == 3); - } - -- /* Write another byte to check for errors. */ -+ /* Write another byte to check for errors (file system full). */ - if (putc(0, fd) == EOF) - retval = FAIL; -- -+theend: - if (fclose(fd) == EOF) - retval = FAIL; - -+ if (fwv != (size_t)1) -+ retval = FAIL; -+ if (retval == FAIL) -+ EMSG(_(e_write)); -+ - return retval; - } - - /* - * Clear the index and wnode fields of "node", it siblings and its -@@ -9888,10 +10085,11 @@ write_spell_prefcond(fd, gap) - { - int i; - char_u *p; - int len; - int totlen; -+ size_t x = 1; /* collect return value of fwrite() */ - - if (fd != NULL) - put_bytes(fd, (long_u)gap->ga_len, 2); /* <prefcondcnt> */ - - totlen = 2 + gap->ga_len; /* length of <prefcondcnt> and <condlen> bytes */ -@@ -9904,11 +10102,11 @@ write_spell_prefcond(fd, gap) - { - len = (int)STRLEN(p); - if (fd != NULL) - { - fputc(len, fd); -- fwrite(p, (size_t)len, (size_t)1, fd); -+ x &= fwrite(p, (size_t)len, (size_t)1, fd); - } - totlen += len; - } - else if (fd != NULL) - fputc(0, fd); -@@ -10052,10 +10250,11 @@ spell_suggest(count) - int mouse_used; - int need_cap; - int limit; - int selected = count; - int badlen = 0; -+ int msg_scroll_save = msg_scroll; - - if (no_spell_checking(curwin)) - return; - - #ifdef FEAT_VISUAL -@@ -10105,11 +10304,14 @@ spell_suggest(count) - /* Get the word and its length. */ - - /* Figure out if the word should be capitalised. */ - need_cap = check_need_cap(curwin->w_cursor.lnum, curwin->w_cursor.col); - -- line = ml_get_curline(); -+ /* Make a copy of current line since autocommands may free the line. */ -+ line = vim_strsave(ml_get_curline()); -+ if (line == NULL) -+ goto skip; - - /* Get the list of suggestions. Limit to 'lines' - 2 or the number in - * 'spellsuggest', whatever is smaller. */ - if (sps_limit > (int)Rows - 2) - limit = (int)Rows - 2; -@@ -10216,11 +10418,13 @@ spell_suggest(count) - #endif - /* Ask for choice. */ - selected = prompt_for_number(&mouse_used); - if (mouse_used) - selected -= lines_left; -- lines_left = Rows; /* avoid more prompt */ -+ lines_left = Rows; /* avoid more prompt */ -+ /* don't delay for 'smd' in normal_cmd() */ -+ msg_scroll = msg_scroll_save; - } - - if (selected > 0 && selected <= sug.su_ga.ga_len && u_save_cursor() == OK) - { - /* Save the from and to text for :spellrepall. */ -@@ -10241,11 +10445,12 @@ spell_suggest(count) - repl_from = vim_strnsave(sug.su_badptr, stp->st_orglen); - repl_to = vim_strsave(stp->st_word); - } - - /* Replace the word. */ -- p = alloc((unsigned)STRLEN(line) - stp->st_orglen + stp->st_wordlen + 1); -+ p = alloc((unsigned)STRLEN(line) - stp->st_orglen -+ + stp->st_wordlen + 1); - if (p != NULL) - { - c = (int)(sug.su_badptr - line); - mch_memmove(p, line, c); - STRCPY(p + c, stp->st_word); -@@ -10266,10 +10471,12 @@ spell_suggest(count) - } - else - curwin->w_cursor = prev_cursor; - - spell_find_cleanup(&sug); -+skip: -+ vim_free(line); - } - - /* - * Check if the word at line "lnum" column "col" is required to start with a - * capital. This uses 'spellcapcheck' of the current buffer. -@@ -10341,14 +10548,13 @@ check_need_cap(lnum, col) - - - /* - * ":spellrepall" - */ --/*ARGSUSED*/ - void - ex_spellrepall(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - pos_T pos = curwin->w_cursor; - char_u *frompat; - int addlen; - char_u *line; -@@ -10728,11 +10934,11 @@ spell_suggest_intern(su, interactive) - /* Adjust the word score for the suggestions found so far for how - * they sounds like. */ - rescore_suggestions(su); - - /* -- * While going throught the soundfold tree "su_maxscore" is the score -+ * While going through the soundfold tree "su_maxscore" is the score - * for the soundfold word, limits the changes that are being tried, - * and "su_sfmaxscore" the rescored score, which is set by - * cleanup_suggestions(). - * First find words with a small edit distance, because this is much - * faster and often already finds the top-N suggestions. If we didn't -@@ -11212,11 +11418,11 @@ suggest_trie_walk(su, lp, fword, soundfo - int soundfold; - { - char_u tword[MAXWLEN]; /* good word collected so far */ - trystate_T stack[MAXWLEN]; - char_u preword[MAXWLEN * 3]; /* word found with proper case; -- * concatanation of prefix compound -+ * concatenation of prefix compound - * words and split word. NUL terminated - * when going deeper but not when coming - * back. */ - char_u compflags[MAXWLEN]; /* compound flags, one for each word */ - trystate_T *sp; -@@ -11478,19 +11684,28 @@ suggest_trie_walk(su, lp, fword, soundfo - compflags[sp->ts_complen] = ((unsigned)flags >> 24); - compflags[sp->ts_complen + 1] = NUL; - vim_strncpy(preword + sp->ts_prewordlen, - tword + sp->ts_splitoff, - sp->ts_twordlen - sp->ts_splitoff); -- p = preword; -- while (*skiptowhite(p) != NUL) -- p = skipwhite(skiptowhite(p)); -- if (fword_ends && !can_compound(slang, p, -- compflags + sp->ts_compsplit)) -- /* Compound is not allowed. But it may still be -- * possible if we add another (short) word. */ -+ -+ /* Verify CHECKCOMPOUNDPATTERN rules. */ -+ if (match_checkcompoundpattern(preword, sp->ts_prewordlen, -+ &slang->sl_comppat)) - compound_ok = FALSE; - -+ if (compound_ok) -+ { -+ p = preword; -+ while (*skiptowhite(p) != NUL) -+ p = skipwhite(skiptowhite(p)); -+ if (fword_ends && !can_compound(slang, p, -+ compflags + sp->ts_compsplit)) -+ /* Compound is not allowed. But it may still be -+ * possible if we add another (short) word. */ -+ compound_ok = FALSE; -+ } -+ - /* Get pointer to last char of previous word. */ - p = preword + sp->ts_prewordlen; - mb_ptr_back(preword, p); - } - } -@@ -11683,14 +11898,13 @@ suggest_trie_walk(su, lp, fword, soundfo - >= slang->sl_compminlen) - #endif - && (slang->sl_compsylmax < MAXWLEN - || sp->ts_complen + 1 - sp->ts_compsplit - < slang->sl_compmax) -- && (byte_in_str(sp->ts_complen == sp->ts_compsplit -- ? slang->sl_compstartflags -- : slang->sl_compallflags, -- ((unsigned)flags >> 24)))) -+ && (can_be_compound(sp, slang, -+ compflags, ((unsigned)flags >> 24)))) -+ - { - try_compound = TRUE; - compflags[sp->ts_complen] = ((unsigned)flags >> 24); - compflags[sp->ts_complen + 1] = NUL; - } -@@ -14806,11 +15020,11 @@ soundalike_score(goodstart, badstart) - /* Failed to compare. */ - break; - - case 0: - /* -- * Lenghts are equal, thus changes must result in same length: An -+ * Lengths are equal, thus changes must result in same length: An - * insert is only possible in combination with a delete. - * 1: check if for identical strings - */ - if (*pl == NUL) - return score; -@@ -15396,14 +15610,13 @@ pop: - #endif - - /* - * ":spellinfo" - */ --/*ARGSUSED*/ - void - ex_spellinfo(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - int lpi; - langp_T *lp; - char_u *p; - -@@ -15943,15 +16156,13 @@ spell_expand_check_cap(col) - * Get list of spelling suggestions. - * Used for Insert mode completion CTRL-X ?. - * Returns the number of matches. The matches are in "matchp[]", array of - * allocated strings. - */ --/*ARGSUSED*/ - int --expand_spelling(lnum, col, pat, matchp) -- linenr_T lnum; -- int col; -+expand_spelling(lnum, pat, matchp) -+ linenr_T lnum UNUSED; - char_u *pat; - char_u ***matchp; - { - garray_T ga; - ---- vim72.orig/src/structs.h -+++ vim72/src/structs.h -@@ -14,11 +14,11 @@ - * There is something wrong in the SAS compiler that makes typedefs not - * valid in include files. Has been fixed in version 6.58. - */ - #if defined(SASC) && SASC < 658 - typedef long linenr_T; --typedef unsigned colnr_T; -+typedef int colnr_T; - typedef unsigned short short_u; - #endif - - /* - * position in file or buffer -@@ -31,13 +31,13 @@ typedef struct - colnr_T coladd; - #endif - } pos_T; - - #ifdef FEAT_VIRTUALEDIT --# define INIT_POS_T {0, 0, 0} -+# define INIT_POS_T(l, c, ca) {l, c, ca} - #else --# define INIT_POS_T {0, 0} -+# define INIT_POS_T(l, c, ca) {l, c} - #endif - - /* - * Same, but without coladd. - */ -@@ -430,10 +430,11 @@ struct buffheader - */ - typedef struct expand - { - int xp_context; /* type of expansion */ - char_u *xp_pattern; /* start of item to expand */ -+ int xp_pattern_len; /* bytes in xp_pattern before cursor */ - #if defined(FEAT_USR_CMDS) && defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL) - char_u *xp_arg; /* completion function */ - int xp_scriptID; /* SID for completion function */ - #endif - int xp_backslash; /* one of the XP_BS_ values */ -@@ -457,11 +458,11 @@ typedef struct expand - * easy manipulation. - */ - typedef struct - { - int hide; /* TRUE when ":hide" was used */ --# ifdef FEAT_BROWSE -+# ifdef FEAT_BROWSE_CMD - int browse; /* TRUE to invoke file dialog */ - # endif - # ifdef FEAT_WINDOWS - int split; /* flags for win_split() */ - int tab; /* > 0 when ":tab" was used */ -@@ -880,10 +881,12 @@ typedef struct - /* Struct to hold the saved typeahead for save_typeahead(). */ - typedef struct - { - typebuf_T save_typebuf; - int typebuf_valid; /* TRUE when save_typebuf valid */ -+ int old_char; -+ int old_mod_mask; - struct buffheader save_stuffbuff; - #ifdef USE_INPUT_BUF - char_u *save_inputbuf; - #endif - } tasave_T; -@@ -1164,11 +1167,12 @@ struct file_buffer - char_u *b_ffname; /* full path file name */ - char_u *b_sfname; /* short file name */ - char_u *b_fname; /* current file name */ - - #ifdef UNIX -- int b_dev; /* device number (-1 if not set) */ -+ int b_dev_valid; /* TRUE when b_dev has a valid number */ -+ dev_t b_dev; /* device number */ - ino_t b_ino; /* inode number */ - #endif - #ifdef FEAT_CW_EDITOR - FSSpec b_FSSpec; /* MacOS File Identification */ - #endif -@@ -1618,10 +1622,18 @@ struct diffblock_S - linenr_T df_lnum[DB_COUNT]; /* line number in buffer */ - linenr_T df_count[DB_COUNT]; /* nr of inserted/changed lines */ - }; - #endif - -+#define SNAP_HELP_IDX 0 -+#ifdef FEAT_AUTOCMD -+# define SNAP_AUCMD_IDX 1 -+# define SNAP_COUNT 2 -+#else -+# define SNAP_COUNT 1 -+#endif -+ - /* - * Tab pages point to the top frame of each tab page. - * Note: Most values are NOT valid for the current tab page! Use "curwin", - * "firstwin", etc. for that. "tp_topframe" is always valid and can be - * compared against "topframe" to find the current tab page. -@@ -1646,11 +1658,11 @@ struct tabpage_S - #ifdef FEAT_DIFF - diff_T *tp_first_diff; - buf_T *(tp_diffbuf[DB_COUNT]); - int tp_diff_invalid; /* list of diffs is outdated */ - #endif -- frame_T *tp_snapshot; /* window layout snapshot */ -+ frame_T *(tp_snapshot[SNAP_COUNT]); /* window layout snapshots */ - #ifdef FEAT_EVAL - dictitem_T tp_winvar; /* variable for "t:" Dictionary */ - dict_T tp_vars; /* internal variables, local to tab page */ - #endif - }; -@@ -1782,14 +1794,19 @@ struct window_S - colnr_T w_old_visual_col; /* last known start of visual part */ - colnr_T w_old_curswant; /* last known value of Curswant */ - #endif - - /* -- * The next three specify the offsets for displaying the buffer: -+ * "w_topline", "w_leftcol" and "w_skipcol" specify the offsets for -+ * displaying the buffer. - */ - linenr_T w_topline; /* buffer line number of the line at the - top of the window */ -+#ifdef FEAT_AUTOCMD -+ char w_topline_was_set; /* flag set to TRUE when topline is set, -+ e.g. by winrestview() */ -+#endif - #ifdef FEAT_DIFF - int w_topfill; /* number of filler lines above w_topline */ - int w_old_topfill; /* w_topfill at last redraw */ - int w_botfill; /* TRUE when filler lines are actually - below w_topline (at end of file) */ -@@ -2268,20 +2285,17 @@ typedef int vimmenu_T; - * Struct to save values in before executing autocommands for a buffer that is - * not the current buffer. Without FEAT_AUTOCMD only "curbuf" is remembered. - */ - typedef struct - { -- buf_T *save_buf; /* saved curbuf */ -+ buf_T *save_curbuf; /* saved curbuf */ - #ifdef FEAT_AUTOCMD -- buf_T *new_curbuf; /* buffer to be used */ -- win_T *save_curwin; /* saved curwin, NULL if it didn't change */ -- win_T *new_curwin; /* new curwin if save_curwin != NULL */ -- pos_T save_cursor; /* saved cursor pos of save_curwin */ -- linenr_T save_topline; /* saved topline of save_curwin */ --# ifdef FEAT_DIFF -- int save_topfill; /* saved topfill of save_curwin */ --# endif -+ int use_aucmd_win; /* using aucmd_win */ -+ win_T *save_curwin; /* saved curwin */ -+ win_T *new_curwin; /* new curwin */ -+ buf_T *new_curbuf; /* new curbuf */ -+ char_u *globaldir; /* saved value of globaldir */ - #endif - } aco_save_T; - - /* - * Generic option table item, only used for printer at the moment. ---- vim72.orig/src/syntax.c -+++ vim72/src/syntax.c -@@ -204,11 +204,11 @@ typedef struct syn_pattern - * The attributes of the syntax item that has been recognized. - */ - static int current_attr = 0; /* attr of current syntax word */ - #ifdef FEAT_EVAL - static int current_id = 0; /* ID of current char for syn_get_id() */ --static int current_trans_id = 0; /* idem, transparancy removed */ -+static int current_trans_id = 0; /* idem, transparency removed */ - #endif - - typedef struct syn_cluster_S - { - char_u *scl_name; /* syntax cluster name */ -@@ -280,11 +280,11 @@ static int keepend_level = -1; - typedef struct state_item - { - int si_idx; /* index of syntax pattern or - KEYWORD_IDX */ - int si_id; /* highlight group ID for keywords */ -- int si_trans_id; /* idem, transparancy removed */ -+ int si_trans_id; /* idem, transparency removed */ - int si_m_lnum; /* lnum of the match */ - int si_m_startcol; /* starting column of the match */ - lpos_T si_m_endpos; /* just after end posn of the match */ - lpos_T si_h_startpos; /* start position of the highlighting */ - lpos_T si_h_endpos; /* end position of the highlighting */ -@@ -1272,11 +1272,11 @@ syn_stack_cleanup() - dist = 999999; - else - dist = syn_buf->b_ml.ml_line_count / (syn_buf->b_sst_len - Rows) + 1; - - /* -- * Go throught the list to find the "tick" for the oldest entry that can -+ * Go through the list to find the "tick" for the oldest entry that can - * be removed. Set "above" when the "tick" for the oldest entry is above - * "b_sst_lasttick" (the display tick wraps around). - */ - tick = syn_buf->b_sst_lasttick; - above = FALSE; -@@ -2317,11 +2317,11 @@ syn_current_attr(syncing, displaying, ca - * ":syn spell toplevel" was used. */ - *can_spell = syn_buf->b_syn_spell == SYNSPL_DEFAULT - ? (syn_buf->b_spell_cluster_id == 0) - : (syn_buf->b_syn_spell == SYNSPL_TOP); - -- /* nextgroup ends at end of line, unless "skipnl" or "skipemtpy" present */ -+ /* nextgroup ends at end of line, unless "skipnl" or "skipempty" present */ - if (current_next_list != NULL - && syn_getcurline()[current_col + 1] == NUL - && !(current_next_flags & (HL_SKIPNL | HL_SKIPEMPTY))) - current_next_list = NULL; - -@@ -3084,10 +3084,16 @@ syn_add_start_off(result, regmatch, spp, - { - result->lnum = regmatch->startpos[0].lnum; - col = regmatch->startpos[0].col; - off = spp->sp_offsets[idx]; - } -+ if (result->lnum > syn_buf->b_ml.ml_line_count) -+ { -+ /* a "\n" at the end of the pattern may take us below the last line */ -+ result->lnum = syn_buf->b_ml.ml_line_count; -+ col = (int)STRLEN(ml_get_buf(syn_buf, result->lnum, FALSE)); -+ } - if (off != 0) - { - base = ml_get_buf(syn_buf, result->lnum, FALSE); - p = base + col; - if (off > 0) -@@ -3222,15 +3228,14 @@ check_keyword_id(line, startcol, endcolp - } - - /* - * Handle ":syntax case" command. - */ --/* ARGSUSED */ - static void - syn_cmd_case(eap, syncing) - exarg_T *eap; -- int syncing; /* not used */ -+ int syncing UNUSED; - { - char_u *arg = eap->arg; - char_u *next; - - eap->nextcmd = find_nextcmd(arg); -@@ -3247,15 +3252,14 @@ syn_cmd_case(eap, syncing) - } - - /* - * Handle ":syntax spell" command. - */ --/* ARGSUSED */ - static void - syn_cmd_spell(eap, syncing) - exarg_T *eap; -- int syncing; /* not used */ -+ int syncing UNUSED; - { - char_u *arg = eap->arg; - char_u *next; - - eap->nextcmd = find_nextcmd(arg); -@@ -3515,41 +3519,38 @@ syn_clear_one(id, syncing) - } - - /* - * Handle ":syntax on" command. - */ --/* ARGSUSED */ - static void - syn_cmd_on(eap, syncing) - exarg_T *eap; -- int syncing; /* not used */ -+ int syncing UNUSED; - { - syn_cmd_onoff(eap, "syntax"); - } - - /* - * Handle ":syntax enable" command. - */ --/* ARGSUSED */ - static void - syn_cmd_enable(eap, syncing) - exarg_T *eap; -- int syncing; /* not used */ -+ int syncing UNUSED; - { - set_internal_string_var((char_u *)"syntax_cmd", (char_u *)"enable"); - syn_cmd_onoff(eap, "syntax"); - do_unlet((char_u *)"g:syntax_cmd", TRUE); - } - - /* - * Handle ":syntax reset" command. - */ --/* ARGSUSED */ - static void - syn_cmd_reset(eap, syncing) - exarg_T *eap; -- int syncing; /* not used */ -+ int syncing UNUSED; - { - eap->nextcmd = check_nextcmd(eap->arg); - if (!eap->skip) - { - set_internal_string_var((char_u *)"syntax_cmd", (char_u *)"reset"); -@@ -3559,27 +3560,25 @@ syn_cmd_reset(eap, syncing) - } - - /* - * Handle ":syntax manual" command. - */ --/* ARGSUSED */ - static void - syn_cmd_manual(eap, syncing) - exarg_T *eap; -- int syncing; /* not used */ -+ int syncing UNUSED; - { - syn_cmd_onoff(eap, "manual"); - } - - /* - * Handle ":syntax off" command. - */ --/* ARGSUSED */ - static void - syn_cmd_off(eap, syncing) - exarg_T *eap; -- int syncing; /* not used */ -+ int syncing UNUSED; - { - syn_cmd_onoff(eap, "nosyntax"); - } - - static void -@@ -4172,11 +4171,10 @@ clear_keywtab(ht) - for (hi = ht->ht_array; todo > 0; ++hi) - { - if (!HASHITEM_EMPTY(hi)) - { - --todo; -- kp = HI2KE(hi); - for (kp = HI2KE(hi); kp != NULL; kp = kp_next) - { - kp_next = kp->ke_next; - vim_free(kp->next_list); - vim_free(kp->k_syn.cont_in_list); -@@ -4459,15 +4457,14 @@ syn_incl_toplevel(id, flagsp) - } - - /* - * Handle ":syntax include [@{group-name}] filename" command. - */ --/* ARGSUSED */ - static void - syn_cmd_include(eap, syncing) - exarg_T *eap; -- int syncing; /* not used */ -+ int syncing UNUSED; - { - char_u *arg = eap->arg; - int sgl_id = 1; - char_u *group_name_end; - char_u *rest; -@@ -4530,15 +4527,14 @@ syn_cmd_include(eap, syncing) - } - - /* - * Handle ":syntax keyword {group-name} [{option}] keyword .." command. - */ --/* ARGSUSED */ - static void - syn_cmd_keyword(eap, syncing) - exarg_T *eap; -- int syncing; /* not used */ -+ int syncing UNUSED; - { - char_u *arg = eap->arg; - char_u *group_name_end; - int syn_id; - char_u *rest; -@@ -5273,15 +5269,14 @@ syn_add_cluster(name) - - /* - * Handle ":syntax cluster {cluster-name} [contains={groupname},..] - * [add={groupname},..] [remove={groupname},..]". - */ --/* ARGSUSED */ - static void - syn_cmd_cluster(eap, syncing) - exarg_T *eap; -- int syncing; /* not used */ -+ int syncing UNUSED; - { - char_u *arg = eap->arg; - char_u *group_name_end; - char_u *rest; - int scl_id; -@@ -5462,15 +5457,14 @@ get_syn_pattern(arg, ci) - } - - /* - * Handle ":syntax sync .." command. - */ --/* ARGSUSED */ - static void - syn_cmd_sync(eap, syncing) - exarg_T *eap; -- int syncing; /* not used */ -+ int syncing UNUSED; - { - char_u *arg_start = eap->arg; - char_u *arg_end; - char_u *key = NULL; - char_u *next_arg; -@@ -6097,14 +6091,13 @@ static char *(case_args[]) = {"match", " - - /* - * Function given to ExpandGeneric() to obtain the list syntax names for - * expansion. - */ --/*ARGSUSED*/ - char_u * - get_syntax_name(xp, idx) -- expand_T *xp; -+ expand_T *xp UNUSED; - int idx; - { - if (expand_what == EXP_SUBCMD) - return (char_u *)subcommands[idx].name; - return (char_u *)case_args[idx]; -@@ -6118,11 +6111,11 @@ get_syntax_name(xp, idx) - int - syn_get_id(wp, lnum, col, trans, spellp, keep_state) - win_T *wp; - long lnum; - colnr_T col; -- int trans; /* remove transparancy */ -+ int trans; /* remove transparency */ - int *spellp; /* return: can do spell checking */ - int keep_state; /* keep state of char at "col" */ - { - /* When the position is not after the current position and in the same - * line of the same buffer, need to restart parsing. */ -@@ -6210,14 +6203,12 @@ syn_get_foldlevel(wp, lnum) - #endif - static char *(highlight_init_both[]) = - { - CENT("ErrorMsg term=standout ctermbg=DarkRed ctermfg=White", - "ErrorMsg term=standout ctermbg=DarkRed ctermfg=White guibg=Red guifg=White"), --#ifdef FEAT_SEARCH_EXTRA - CENT("IncSearch term=reverse cterm=reverse", - "IncSearch term=reverse cterm=reverse gui=reverse"), --#endif - CENT("ModeMsg term=bold cterm=bold", - "ModeMsg term=bold cterm=bold gui=bold"), - CENT("NonText term=bold ctermfg=Blue", - "NonText term=bold ctermfg=Blue gui=bold guifg=Blue"), - CENT("StatusLine term=reverse,bold cterm=reverse,bold", -@@ -7533,11 +7524,11 @@ highlight_clear(idx) - } - - #if defined(FEAT_GUI) || defined(PROTO) - /* - * Set the normal foreground and background colors according to the "Normal" -- * highlighighting group. For X11 also set "Menu", "Scrollbar", and -+ * highlighting group. For X11 also set "Menu", "Scrollbar", and - * "Tooltip" colors. - */ - void - set_normal_colors() - { -@@ -7742,18 +7733,17 @@ fontset_name2handle(name, fixed_width) - # endif - - /* - * Get the font or fontset for one highlight group. - */ --/*ARGSUSED*/ - static void - hl_do_font(idx, arg, do_normal, do_menu, do_tooltip) - int idx; - char_u *arg; -- int do_normal; /* set normal font */ -- int do_menu; /* set menu font */ -- int do_tooltip; /* set tooltip font */ -+ int do_normal; /* set normal font */ -+ int do_menu UNUSED; /* set menu font */ -+ int do_tooltip UNUSED; /* set tooltip font */ - { - # ifdef FEAT_XFONTSET - /* If 'guifontset' is not empty, first try using the name as a - * fontset. If that doesn't work, use it as a font name. */ - if (*p_guifontset != NUL -@@ -8332,32 +8322,42 @@ highlight_has_attr(id, flag, modec) - * Return color name of highlight group "id". - */ - char_u * - highlight_color(id, what, modec) - int id; -- char_u *what; /* "fg", "bg", "sp", "fg#", "bg#" or "sp#" */ -+ char_u *what; /* "font", "fg", "bg", "sp", "fg#", "bg#" or "sp#" */ - int modec; /* 'g' for GUI, 'c' for cterm, 't' for term */ - { - static char_u name[20]; - int n; - int fg = FALSE; - # ifdef FEAT_GUI - int sp = FALSE; -+ int font = FALSE; - # endif - - if (id <= 0 || id > highlight_ga.ga_len) - return NULL; - -- if (TOLOWER_ASC(what[0]) == 'f') -+ if (TOLOWER_ASC(what[0]) == 'f' && TOLOWER_ASC(what[1]) == 'g') - fg = TRUE; - # ifdef FEAT_GUI -- else if (TOLOWER_ASC(what[0]) == 's') -+ else if (TOLOWER_ASC(what[0]) == 'f' && TOLOWER_ASC(what[1]) == 'o' -+ && TOLOWER_ASC(what[2]) == 'n' && TOLOWER_ASC(what[3]) == 't') -+ font = TRUE; -+ else if (TOLOWER_ASC(what[0]) == 's' && TOLOWER_ASC(what[1]) == 'p') - sp = TRUE; -+ else if (!(TOLOWER_ASC(what[0]) == 'b' && TOLOWER_ASC(what[1]) == 'g')) -+ return NULL; - if (modec == 'g') - { -+ /* return font name */ -+ if (font) -+ return HL_TABLE()[id - 1].sg_font_name; -+ - /* return #RRGGBB form (only possible when GUI is running) */ -- if (gui.in_use && what[1] && what[2] == '#') -+ if (gui.in_use && what[2] == '#') - { - guicolor_T color; - long_u rgb; - static char_u buf[10]; - -@@ -8380,10 +8380,12 @@ highlight_color(id, what, modec) - return (HL_TABLE()[id - 1].sg_gui_fg_name); - if (sp) - return (HL_TABLE()[id - 1].sg_gui_sp_name); - return (HL_TABLE()[id - 1].sg_gui_bg_name); - } -+ if (font || sp) -+ return NULL; - # endif - if (modec == 'c') - { - if (fg) - n = HL_TABLE()[id - 1].sg_cterm_fg - 1; -@@ -8658,10 +8660,11 @@ syn_add_group(name) - for (p = name; *p != NUL; ++p) - { - if (!vim_isprintc(*p)) - { - EMSG(_("E669: Unprintable character in group name")); -+ vim_free(name); - return 0; - } - else if (!ASCII_ISALNUM(*p) && *p != '_') - { - /* This is an error, but since there previously was no check only -@@ -9148,14 +9151,13 @@ highlight_list_two(cnt, attr) - || defined(FEAT_SIGNS) || defined(PROTO) - /* - * Function given to ExpandGeneric() to obtain the list of group names. - * Also used for synIDattr() function. - */ --/*ARGSUSED*/ - char_u * - get_highlight_name(xp, idx) -- expand_T *xp; -+ expand_T *xp UNUSED; - int idx; - { - #ifdef FEAT_CMDL_COMPL - if (idx == highlight_ga.ga_len && include_none != 0) - return (char_u *)"none"; ---- vim72.orig/src/tag.c -+++ vim72/src/tag.c -@@ -88,21 +88,22 @@ static char_u *topmsg = (char_u *)N_("E5 - static char_u *tagmatchname = NULL; /* name of last used tag */ - - /* - * We use ftello() here, if available. It returns off_t instead of long, - * which helps if long is 32 bit and off_t is 64 bit. -+ * We assume that when fseeko() is available then ftello() is too. - */ --#ifdef HAVE_FTELLO -+#ifdef HAVE_FSEEKO - # define ftell ftello - #endif - - #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX) - /* - * Tag for preview window is remembered separately, to avoid messing up the - * normal tagstack. - */ --static taggy_T ptag_entry = {NULL}; -+static taggy_T ptag_entry = {NULL, {INIT_POS_T(0, 0, 0), 0}, 0, 0}; - #endif - - /* - * Jump to tag; handling of tag commands and tag stack - * -@@ -513,11 +514,11 @@ do_tag(tag, type, count, forceit, verbos - - /* - * If a count is supplied to the ":tag <name>" command, then - * jump to count'th matching tag. - */ -- if (type == DT_TAG && count > 0) -+ if (type == DT_TAG && *tag != NUL && count > 0) - cur_match = count - 1; - - if (type == DT_SELECT || type == DT_JUMP - #if defined(FEAT_QUICKFIX) - || type == DT_LTAG -@@ -616,11 +617,11 @@ do_tag(tag, type, count, forceit, verbos - MSG_PUTS_ATTR(_(" # pri kind tag"), hl_attr(HLF_T)); - msg_clr_eos(); - taglen_advance(taglen); - MSG_PUTS_ATTR(_("file\n"), hl_attr(HLF_T)); - -- for (i = 0; i < num_matches; ++i) -+ for (i = 0; i < num_matches && !got_int; ++i) - { - parse_match(matches[i], &tagp); - if (!new_tag && ( - #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX) - (g_do_tagpreview -@@ -653,10 +654,12 @@ do_tag(tag, type, count, forceit, verbos - msg_puts_long_attr(p, hl_attr(HLF_D)); - vim_free(p); - } - if (msg_col > 0) - msg_putchar('\n'); -+ if (got_int) -+ break; - msg_advance(15); - - /* print any extra fields */ - command_end = tagp.command_end; - if (command_end != NULL) -@@ -687,10 +690,12 @@ do_tag(tag, type, count, forceit, verbos - while (*p && *p != '\r' && *p != '\n') - { - if (msg_col + ptr2cells(p) >= Columns) - { - msg_putchar('\n'); -+ if (got_int) -+ break; - msg_advance(15); - } - p = msg_outtrans_one(p, attr); - if (*p == TAB) - { -@@ -702,10 +707,12 @@ do_tag(tag, type, count, forceit, verbos - } - } - if (msg_col > 15) - { - msg_putchar('\n'); -+ if (got_int) -+ break; - msg_advance(15); - } - } - else - { -@@ -732,10 +739,12 @@ do_tag(tag, type, count, forceit, verbos - - while (p != command_end) - { - if (msg_col + (*p == TAB ? 1 : ptr2cells(p)) > Columns) - msg_putchar('\n'); -+ if (got_int) -+ break; - msg_advance(15); - - /* skip backslash used for escaping command char */ - if (*p == '\\' && *(p + 1) == *tagp.command) - ++p; -@@ -758,16 +767,13 @@ do_tag(tag, type, count, forceit, verbos - break; - } - if (msg_col) - msg_putchar('\n'); - ui_breakcheck(); -- if (got_int) -- { -- got_int = FALSE; /* only stop the listing */ -- break; -- } - } -+ if (got_int) -+ got_int = FALSE; /* only stop the listing */ - ask_for_selection = TRUE; - } - #if defined(FEAT_QUICKFIX) && defined(FEAT_EVAL) - else if (type == DT_LTAG) - { -@@ -1098,14 +1104,13 @@ taglen_advance(l) - } - - /* - * Print the tag stack - */ --/*ARGSUSED*/ - void - do_tags(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - int i; - char_u *name; - taggy_T *tagstack = curwin->w_tagstack; - int tagstackidx = curwin->w_tagstackidx; -@@ -2523,15 +2528,14 @@ static void found_tagfile_cb __ARGS((cha - - /* - * Callback function for finding all "tags" and "tags-??" files in - * 'runtimepath' doc directories. - */ --/*ARGSUSED*/ - static void - found_tagfile_cb(fname, cookie) - char_u *fname; -- void *cookie; -+ void *cookie UNUSED; - { - if (ga_grow(&tag_fnames, 1) == OK) - ((char_u **)(tag_fnames.ga_data))[tag_fnames.ga_len++] = - vim_strsave(fname); - } -@@ -2540,10 +2544,19 @@ found_tagfile_cb(fname, cookie) - void - free_tag_stuff() - { - ga_clear_strings(&tag_fnames); - do_tag(NULL, DT_FREE, 0, 0, 0); -+ tag_freematch(); -+ -+# if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX) -+ if (ptag_entry.tagname) -+ { -+ vim_free(ptag_entry.tagname); -+ ptag_entry.tagname = NULL; -+ } -+# endif - } - #endif - - /* - * Get the next name of a tag file from the tag file list. -@@ -2723,21 +2736,38 @@ parse_tag_line(lbuf, - * 1: struct EnvBase ^?EnvBase^A139,4627 - * 2: #define ARPB_WILD_WORLD ^?153,5194 - */ - p_7f = vim_strchr(lbuf, 0x7f); - if (p_7f == NULL) -+ { -+etag_fail: -+ if (vim_strchr(lbuf, '\n') == NULL) -+ { -+ /* Truncated line. Ignore it. */ -+ if (p_verbose >= 5) -+ { -+ verbose_enter(); -+ MSG(_("Ignoring long line in tags file")); -+ verbose_leave(); -+ } -+ tagp->command = lbuf; -+ tagp->tagname = lbuf; -+ tagp->tagname_end = lbuf; -+ return OK; -+ } - return FAIL; -+ } - - /* Find ^A. If not found the line number is after the 0x7f */ - p = vim_strchr(p_7f, Ctrl_A); - if (p == NULL) - p = p_7f + 1; - else - ++p; - - if (!VIM_ISDIGIT(*p)) /* check for start of line number */ -- return FAIL; -+ goto etag_fail; - tagp->command = p; - - - if (p[-1] == Ctrl_A) /* first format: explicit tagname given */ - { -@@ -2747,11 +2777,11 @@ parse_tag_line(lbuf, - else /* second format: isolate tagname */ - { - /* find end of tagname */ - for (p = p_7f - 1; !vim_iswordc(*p); --p) - if (p == lbuf) -- return FAIL; -+ goto etag_fail; - tagp->tagname_end = p + 1; - while (p >= lbuf && vim_iswordc(*p)) - --p; - tagp->tagname = p + 1; - } -@@ -3760,11 +3790,11 @@ add_tag_field(dict, field_name, start, e - end = start + STRLEN(start); - while (end > start && (end[-1] == '\r' || end[-1] == '\n')) - --end; - } - len = (int)(end - start); -- if (len > sizeof(buf) - 1) -+ if (len > (int)sizeof(buf) - 1) - len = sizeof(buf) - 1; - vim_strncpy(buf, start, len); - } - buf[len] = NUL; - return dict_add_nr_str(dict, field_name, 0L, buf); ---- vim72.orig/src/term.c -+++ vim72/src/term.c -@@ -2879,11 +2879,11 @@ ttest(pairs) - T_CAF = empty_option; - } - - /* if 'Sb' and 'AB' are not defined, reset "Co" */ - if (*T_CSB == NUL && *T_CAB == NUL) -- T_CCO = empty_option; -+ free_one_termoption(T_CCO); - - /* Set 'weirdinvert' according to value of 't_xs' */ - p_wiv = (*T_XS != NUL); - } - need_gather = TRUE; -@@ -2904,11 +2904,11 @@ add_long_to_buf(val, dst) - char_u *dst; - { - int i; - int shift; - -- for (i = 1; i <= sizeof(long_u); i++) -+ for (i = 1; i <= (int)sizeof(long_u); i++) - { - shift = 8 * (sizeof(long_u) - i); - dst[i - 1] = (char_u) ((val >> shift) & 0xff); - } - } -@@ -2935,11 +2935,11 @@ get_long_from_buf(buf, val) - - *val = 0; - len = get_bytes_from_buf(buf, bytes, (int)sizeof(long_u)); - if (len != -1) - { -- for (i = 0; i < sizeof(long_u); i++) -+ for (i = 0; i < (int)sizeof(long_u); i++) - { - shift = 8 * (sizeof(long_u) - 1 - i); - *val += (long_u)bytes[i] << shift; - } - } -@@ -4918,11 +4918,19 @@ check_termcode(max_offset, buf, buflen) - - /* Finally, add the special key code to our string */ - key_name[0] = KEY2TERMCAP0(key); - key_name[1] = KEY2TERMCAP1(key); - if (key_name[0] == KS_KEY) -- string[new_slen++] = key_name[1]; /* from ":set <M-b>=xx" */ -+ { -+ /* from ":set <M-b>=xx" */ -+#ifdef FEAT_MBYTE -+ if (has_mbyte) -+ new_slen += (*mb_char2bytes)(key_name[1], string + new_slen); -+ else -+#endif -+ string[new_slen++] = key_name[1]; -+ } - else - { - string[new_slen++] = K_SPECIAL; - string[new_slen++] = key_name[0]; - string[new_slen++] = key_name[1]; -@@ -5545,11 +5553,11 @@ check_for_codes_from_term() - * Translate an internal mapping/abbreviation representation into the - * corresponding external one recognized by :map/:abbrev commands; - * respects the current B/k/< settings of 'cpoption'. - * - * This function is called when expanding mappings/abbreviations on the -- * command-line, and for building the "Ambiguous mapping..." error messæge. -+ * command-line, and for building the "Ambiguous mapping..." error message. - * - * It uses a growarray to build the translation string since the - * latter can be wider than the original description. The caller has to - * free the string afterwards. - * ---- vim72.orig/src/testdir/Make_amiga.mak -+++ vim72/src/testdir/Make_amiga.mak -@@ -23,11 +23,12 @@ SCRIPTS = test1.out test3.out test4.out - test33.out test34.out test35.out test36.out test37.out \ - test38.out test39.out test40.out test41.out test42.out \ - test43.out test44.out test45.out test46.out test47.out \ - test48.out test51.out test53.out test54.out test55.out \ - test56.out test57.out test58.out test59.out test60.out \ -- test61.out test62.out test63.out test64.out test65.out -+ test61.out test62.out test63.out test64.out test65.out \ -+ test66.out test67.out test68.out test69.out - - .SUFFIXES: .in .out - - nongui: /tmp $(SCRIPTS) - csh -c echo ALL DONE -@@ -108,5 +109,9 @@ test60.out: test60.in - test61.out: test61.in - test62.out: test62.in - test63.out: test63.in - test64.out: test64.in - test65.out: test65.in -+test66.out: test66.in -+test67.out: test67.in -+test68.out: test68.in -+test69.out: test69.in ---- vim72.orig/src/testdir/Make_dos.mak -+++ vim72/src/testdir/Make_dos.mak -@@ -24,13 +24,14 @@ SCRIPTS16 = test1.out test19.out test20. - SCRIPTS = test3.out test4.out test5.out test6.out test7.out \ - test8.out test9.out test11.out test13.out test14.out \ - test15.out test17.out test18.out test21.out test26.out \ - test30.out test31.out test32.out test33.out test34.out \ - test37.out test38.out test39.out test40.out test41.out \ -- test42.out test52.out test65.out -+ test42.out test52.out test65.out test66.out test67.out \ -+ test68.out test69.out - --SCRIPTS32 = test50.out -+SCRIPTS32 = test50.out test70.out - - SCRIPTS_GUI = test16.out - - .SUFFIXES: .in .out - -@@ -53,10 +54,11 @@ clean: - -del *.out - -if exist test.ok del test.ok - -if exist small.vim del small.vim - -if exist tiny.vim del tiny.vim - -if exist mbyte.vim del mbyte.vim -+ -if exist mzscheme.vim del mzscheme.vim - -del X* - -if exist viminfo del viminfo - - .in.out: - copy $*.ok test.ok ---- /dev/null -+++ vim72/src/testdir/Make_ming.mak -@@ -0,0 +1,93 @@ -+# Makefile to run tests for Vim, on Dos-like machines -+# with sh.exe or zsh.exe in the path or not. -+# -+# Author: Bill McCarthy -+# -+# Note that test54 has been removed until it is fixed. -+# -+# Requires a set of Unix tools: echo, diff, etc. -+ -+ifneq (sh.exe, $(SHELL)) -+DEL = rm -f -+MV = mv -+CP = cp -+DIRSLASH = / -+else -+DEL = del -+MV = rename -+CP = copy -+DIRSLASH = \\ -+endif -+ -+VIMPROG = ..$(DIRSLASH)vim -+ -+# Omitted: -+# test2 "\\tmp" doesn't work. -+# test10 'errorformat' is different -+# test12 can't unlink a swap file -+# test25 uses symbolic link -+# test27 can't edit file with "*" in file name -+# test31 16 bit version runs out of memory... -+ -+SCRIPTS16 = test1.out test19.out test20.out test22.out \ -+ test23.out test24.out test28.out test29.out \ -+ test35.out test36.out test43.out \ -+ test44.out test45.out test46.out test47.out \ -+ test48.out test51.out test53.out \ -+ test55.out test56.out test57.out test58.out test59.out \ -+ test60.out test61.out test62.out test63.out test64.out -+ -+# Had to remove test54 which doesn't work yet. -+# test54.out -+ -+SCRIPTS = test3.out test4.out test5.out test6.out test7.out \ -+ test8.out test9.out test11.out test13.out test14.out \ -+ test15.out test17.out test18.out test21.out test26.out \ -+ test30.out test31.out test32.out test33.out test34.out \ -+ test37.out test38.out test39.out test40.out test41.out \ -+ test42.out test52.out test65.out test66.out test67.out \ -+ test68.out test69.out -+ -+SCRIPTS32 = test50.out test70.out -+ -+SCRIPTS_GUI = test16.out -+ -+.SUFFIXES: .in .out -+ -+vimall: fixff $(SCRIPTS16) $(SCRIPTS) $(SCRIPTS_GUI) $(SCRIPTS32) -+ echo ALL DONE -+ -+nongui: fixff $(SCRIPTS16) $(SCRIPTS) -+ echo ALL DONE -+ -+small: -+ echo ALL DONE -+ -+gui: fixff $(SCRIPTS16) $(SCRIPTS) $(SCRIPTS_GUI) -+ echo ALL DONE -+ -+win32: fixff $(SCRIPTS16) $(SCRIPTS) $(SCRIPTS32) -+ echo ALL DONE -+ -+fixff: -+ -$(VIMPROG) -u dos.vim --noplugin "+argdo set ff=dos|upd" +q *.in *.ok -+ -+clean: -+ -$(DEL) *.out -+ -$(DEL) test.ok -+ -$(DEL) small.vim -+ -$(DEL) tiny.vim -+ -$(DEL) mbyte.vim -+ -$(DEL) mzscheme.vim -+ -$(DEL) X* -+ -$(DEL) viminfo -+ -+.in.out: -+ $(CP) $*.ok test.ok -+ $(VIMPROG) -u dos.vim -U NONE --noplugin -s dotest.in $*.in -+ diff test.out $*.ok -+ -$(DEL) $*.out -+ $(MV) test.out $*.out -+ -$(DEL) X* -+ -$(DEL) test.ok -+ -$(DEL) viminfo ---- vim72.orig/src/testdir/Make_os2.mak -+++ vim72/src/testdir/Make_os2.mak -@@ -23,11 +23,12 @@ SCRIPTS = test1.out test3.out test4.out - test33.out test34.out test35.out test36.out test37.out \ - test38.out test39.out test40.out test41.out test42.out \ - test43.out test44.out test45.out test46.out test47.out \ - test48.out test51.out test53.out test54.out test55.out \ - test56.out test57.out test58.out test59.out test60.out \ -- test61.out test62.out test63.out test64.out test65.out -+ test61.out test62.out test63.out test64.out test65.out \ -+ test66.out test67.out test68.out test69.out - - .SUFFIXES: .in .out - - all: /tmp $(SCRIPTS) - @echo ALL DONE ---- vim72.orig/src/testdir/Make_vms.mms -+++ vim72/src/testdir/Make_vms.mms -@@ -2,13 +2,13 @@ - # Makefile to run all tests for Vim on VMS - # - # Authors: Zoltan Arpadffy, <arpadffy@polarhome.com> - # Sandor Kopanyi, <sandor.kopanyi@mailbox.hu> - # --# Last change: 2008 Jun 19 -+# Last change: 2009 Sep 11 - # --# This has been tested on VMS 6.2 to 7.2 on DEC Alpha and VAX. -+# This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64. - # Edit the lines in the Configuration section below to select. - # - # Execute with: - # mms/descrip=Make_vms.mms - # Cleanup with: -@@ -30,10 +30,19 @@ - # Comment out if you want to run Unix specific tests as well, but please - # be aware, that on OpenVMS will fail, because of cat, rm, etc commands - # and directory handling. - # WANT_UNIX = YES - -+# Comment out if you want to run Win32 specific tests as well, but please -+# be aware, that on OpenVMS will fail, because of cat, rm, etc commands -+# and directory handling. -+# WANT_WIN = YES -+ -+# Comment out if you want to run spell checker tests. -+# They fail because VMS does not support file names. -+# WANT_SPELL = YES -+ - # Comment out if you have gzip on your system - # HAVE_GZIP = YES - - # Comment out if you have GNU compatible diff on your system - # HAVE_GDIFF = YES -@@ -51,25 +60,34 @@ VIMPROG = <->vim.exe - SCRIPT = test1.out test2.out test3.out test4.out test5.out \ - test6.out test7.out test8.out test9.out test10a.out\ - test13.out test14.out test15.out test17.out \ - test18.out test19.out test20.out test21.out test22.out \ - test23.out test24.out test26.out \ -- test28.out test29.out test31.out test32.out \ -+ test28.out test29.out test30.out test31.out test32.out \ - test33.out test34.out test35.out test36.out test37.out \ - test38.out test39.out test40.out test41.out test42.out \ - test43.out test44.out test45.out test46.out \ - test48.out test51.out test53.out test54.out test55.out \ -- test56.out test57.out test58.out test59.out test60.out \ -- test61.out test62.out test63.out test64.out test65.out -+ test56.out test57.out test60.out \ -+ test61.out test62.out test63.out test64.out test65.out \ -+ test66.out test67.out test68.out test69.out - - .IFDEF WANT_GUI - SCRIPT_GUI = test16.out - GUI_OPTION = -g - .ENDIF - - .IFDEF WANT_UNIX --SCRIPT_UNIX = test10.out test12.out test25.out test27.out test30.out test49.out -+SCRIPT_UNIX = test10.out test12.out test25.out test27.out test49.out -+.ENDIF -+ -+.IFDEF WANT_WIN -+SCRIPT_WIN = test50.out test52.out -+.ENDIF -+ -+.IFDEF WANT_SPELL -+SCRIPT_SPELL = test58.out test59.out - .ENDIF - - .IFDEF HAVE_GZIP - SCRIPT_GZIP = test11.out - .ENDIF -@@ -82,15 +100,15 @@ SCRIPT_GDIFF = test47.out - -@ write sys$output " " - -@ write sys$output "-----------------------------------------------" - -@ write sys$output " "$*" " - -@ write sys$output "-----------------------------------------------" - -@ create/term/wait mcr $(VIMPROG) $(GUI_OPTION) -u vms.vim --noplugin -s dotest.in $*.in -- -@ if "''F$SEARCH("test.out.*")'" .NES. "" then differences test.out $*.ok; -+ -@ if "''F$SEARCH("test.out.*")'" .NES. "" then differences /par test.out $*.ok; - -@ if "''F$SEARCH("test.out.*")'" .NES. "" then rename test.out $*.out - -@ if "''F$SEARCH("Xdotest.*")'" .NES. "" then delete/noconfirm/nolog Xdotest.*.* - --all : clean nolog $(SCRIPT) $(SCRIPT_GUI) $(SCRIPT_UNIX) $(SCRIPT_GZIP) $(SCRIPT_GDIFF) -+all : clean nolog $(SCRIPT) $(SCRIPT_GUI) $(SCRIPT_UNIX) $(SCRIPT_WIN) $(SCRIPT_SPELL) $(SCRIPT_GZIP) $(SCRIPT_GDIFF) - -@ write sys$output " " - -@ write sys$output "-----------------------------------------------" - -@ write sys$output " All done" - -@ write sys$output "-----------------------------------------------" - -@ deassign sys$output -@@ -111,16 +129,26 @@ nolog : - -@ write sys$output " Test results:" - -@ write sys$output "-----------------------------------------------" - -@ write sys$output "MAKE_VMS.MMS options:" - -@ write sys$output " WANT_GUI = ""$(WANT_GUI)"" " - -@ write sys$output " WANT_UNIX = ""$(WANT_UNIX)"" " -+ -@ write sys$output " WANT_WIN = ""$(WANT_WIN)"" " -+ -@ write sys$output " WANT_SPELL= ""$(WANT_SPELL)"" " - -@ write sys$output " HAVE_GZIP = ""$(HAVE_GZIP)"" " - -@ write sys$output " HAVE_GDIFF= ""$(HAVE_GDIFF)"" " - -@ write sys$output "Default vimrc file is VMS.VIM: - -@ write sys$output "-----------------------------------------------" - -@ type VMS.VIM - - clean : - -@ if "''F$SEARCH("*.out")'" .NES. "" then delete/noconfirm/nolog *.out.* - -@ if "''F$SEARCH("test.log")'" .NES. "" then delete/noconfirm/nolog test.log.* -+ -@ if "''F$SEARCH("test.ok")'" .NES. "" then delete/noconfirm/nolog test.ok.* - -@ if "''F$SEARCH("Xdotest.*")'" .NES. "" then delete/noconfirm/nolog Xdotest.*.* - -@ if "''F$SEARCH("*.*_sw*")'" .NES. "" then delete/noconfirm/nolog *.*_sw*.* -+ -@ if "''F$SEARCH("*.failed")'" .NES. "" then delete/noconfirm/nolog *.failed.* -+ -@ if "''F$SEARCH("*.rej")'" .NES. "" then delete/noconfirm/nolog *.rej.* -+ -@ if "''F$SEARCH("tiny.vim")'" .NES. "" then delete/noconfirm/nolog tiny.vim.* -+ -@ if "''F$SEARCH("small.vim")'" .NES. "" then delete/noconfirm/nolog small.vim.* -+ -@ if "''F$SEARCH("mbyte.vim")'" .NES. "" then delete/noconfirm/nolog mbyte.vim.* -+ -@ if "''F$SEARCH("viminfo.*")'" .NES. "" then delete/noconfirm/nolog viminfo.*.* -+ ---- vim72.orig/src/testdir/Makefile -+++ vim72/src/testdir/Makefile -@@ -2,13 +2,15 @@ - # Makefile to run all tests for Vim - # - - VIMPROG = ../vim - --# Uncomment this line for using valgrind. --# The output goes into a file "valgrind.$PID" (sorry, no test number). --# VALGRIND = valgrind --tool=memcheck --leak-check=yes --num-callers=15 --logfile=valgrind -+# Uncomment this line to use valgrind for memory leaks and extra warnings. -+# The output goes into a file "valgrind.testN" -+# Vim should be compiled with EXITFREE to avoid false warnings. -+# This will make testing about 10 times as slow. -+# VALGRIND = valgrind --tool=memcheck --leak-check=yes --num-callers=15 --log-file=valgrind.$* - - SCRIPTS = test1.out test2.out test3.out test4.out test5.out test6.out \ - test7.out test8.out test9.out test10.out test11.out \ - test12.out test13.out test14.out test15.out test17.out \ - test18.out test19.out test20.out test21.out test22.out \ -@@ -18,33 +20,36 @@ SCRIPTS = test1.out test2.out test3.out - test38.out test39.out test40.out test41.out test42.out \ - test43.out test44.out test45.out test46.out test47.out \ - test48.out test49.out test51.out test52.out test53.out \ - test54.out test55.out test56.out test57.out test58.out \ - test59.out test60.out test61.out test62.out test63.out \ -- test64.out test65.out -+ test64.out test65.out test66.out test67.out test68.out \ -+ test69.out test70.out - - SCRIPTS_GUI = test16.out - - .SUFFIXES: .in .out - --nongui: nolog $(SCRIPTS) -- @echo -- @cat test.log -- @echo ALL DONE -+nongui: nolog $(SCRIPTS) report -+ -+gui: nolog $(SCRIPTS) $(SCRIPTS_GUI) report - --gui: nolog $(SCRIPTS) $(SCRIPTS_GUI) -+report: - @echo -- @cat test.log -- @echo ALL DONE -+ @echo 'Test results:' -+ @/bin/sh -c "if test -f test.log; \ -+ then cat test.log; echo TEST FAILURE; exit 1; \ -+ else echo ALL DONE; \ -+ fi" - - $(SCRIPTS) $(SCRIPTS_GUI): $(VIMPROG) - - clean: -- -rm -rf *.out *.failed *.rej *.orig test.log tiny.vim small.vim mbyte.vim test.ok X* valgrind.pid* viminfo -+ -rm -rf *.out *.failed *.rej *.orig test.log tiny.vim small.vim mbyte.vim mzscheme.vim test.ok X* valgrind.pid* viminfo - - test1.out: test1.in -- -rm -f $*.failed tiny.vim small.vim mbyte.vim test.ok X* viminfo -+ -rm -f $*.failed tiny.vim small.vim mbyte.vim mzscheme.vim test.ok X* viminfo - $(VALGRIND) $(VIMPROG) -u unix.vim -U NONE --noplugin -s dotest.in $*.in - @/bin/sh -c "if diff test.out $*.ok; \ - then mv -f test.out $*.out; \ - else echo; \ - echo test1 FAILED - Something basic is wrong; \ -@@ -69,6 +74,6 @@ test1.out: test1.in - test49.out: test49.vim - - test60.out: test60.vim - - nolog: -- -echo Test results: >test.log -+ -rm -f test.log ---- vim72.orig/src/testdir/main.aap -+++ vim72/src/testdir/main.aap -@@ -30,15 +30,15 @@ gui: newlog $Scripts $ScriptsGUI - :print ALL DONE - - $Scripts $ScriptsGUI: $VimProg - - clean: -- :del {r}{force} *.out test.log tiny.vim small.vim mbyte.vim test.ok X* -+ :del {r}{force} *.out test.log tiny.vim small.vim mbyte.vim mzscheme.vim test.ok X* - - # test1 is special, it checks for features - test1.out: test1.in -- :del {force} test1.failed tiny.vim small.vim mbyte.vim -+ :del {force} test1.failed tiny.vim small.vim mbyte.vim mzscheme.vim - :sys {i} $VimProg -u unix.vim -U NONE --noplugin -s dotest.in test1.in - @if os.system("diff test.out test1.ok") != 0: - :error test1 FAILED - Something basic is wrong - :move {force} test.out test1.out - :del {r}{force} X* ---- vim72.orig/src/testdir/test1.in -+++ vim72/src/testdir/test1.in -@@ -11,10 +11,11 @@ If Vim was not compiled with the +window - set like small.vim above. tiny.vim is sourced by tests that require the - +windows feature or other features that are missing in the tiny version. - - If Vim was not compiled with the +multi_byte feature, the mbyte.vim script will be set like small.vim above. mbyte.vim is sourced by tests that require the - +multi_byte feature. -+Similar logic is applied to the +mzscheme feature, using mzscheme.vim. - - STARTTEST - :" Write a single line to test.out to check if testing works at all. - :%d - athis is a test:w! test.out -@@ -23,12 +24,15 @@ athis is a test:w! test.out - :w! tiny.vim - ae! test.ok - w! test.out - qa! - :w! mbyte.vim -+:w! mzscheme.vim - :" If +multi_byte feature supported, make mbyte.vim empty. - :if has("multi_byte") | sp another | w! mbyte.vim | q | endif -+:" If +mzscheme feature supported, make mzscheme.vim empty. -+:if has("mzscheme") | sp another | w! mzscheme.vim | q | endif - :" If +eval feature supported quit here, leaving tiny.vim and small.vim empty. - :" Otherwise write small.vim to skip the test. - :if 1 | q! | endif - :w! small.vim - :" If +windows feature not supported :sp will fail and tiny.vim will be ---- vim72.orig/src/testdir/test30.in -+++ vim72/src/testdir/test30.in -@@ -22,14 +22,21 @@ STARTTEST - :set bin noeol - :$w! XXMac - :set nobin eol - :bwipe XXUnix XXDos XXMac - :" create mixed format files --:!cat XXUnix XXDos >XXUxDs --:!cat XXUnix XXMac >XXUxMac --:!cat XXDos XXMac >XXDosMac --:!cat XXUnix XXDos XXMac >XXUxDsMc -+:if has("vms") -+: !copy XXUnix,XXDos XXUxDs. -+: !copy XXUnix,XXMac XXUxMac. -+: !copy XXDos,XXMac XXDosMac. -+: !copy XXUnix,XXDos,XXMac XXUxDsMc. -+:else -+: !cat XXUnix XXDos >XXUxDs -+: !cat XXUnix XXMac >XXUxMac -+: !cat XXDos XXMac >XXDosMac -+: !cat XXUnix XXDos XXMac >XXUxDsMc -+:endif - :" - :" try reading and writing with 'fileformats' empty - :set fileformat=unix - :e! XXUnix - :w! test.out ---- vim72.orig/src/testdir/test45.in -+++ vim72/src/testdir/test45.in -@@ -26,13 +26,20 @@ kYpj:call append("$", foldlevel(".")) - /^2 b - i jI :call append("$", "indent " . foldlevel(".")) - k:call append("$", foldlevel(".")) - :" test syntax folding - :set fdm=syntax fdl=0 --:syn region Hup start="dd" end="hh" fold -+:syn region Hup start="dd" end="ii" fold contains=Fd1,Fd2,Fd3 -+:syn region Fd1 start="ee" end="ff" fold contained -+:syn region Fd2 start="gg" end="hh" fold contained -+:syn region Fd3 start="commentstart" end="commentend" fold contained - Gzk:call append("$", "folding " . getline(".")) - k:call append("$", getline(".")) -+jAcommentstart Acommentend:set fdl=1 -+3j:call append("$", getline(".")) -+:set fdl=0 -+zOj:call append("$", getline(".")) - :" test expression folding - :fun Flvl() - let l = getline(v:lnum) - if l =~ "bb$" - return 2 ---- vim72.orig/src/testdir/test45.ok -+++ vim72/src/testdir/test45.ok -@@ -6,11 +6,13 @@ marker 2 - 1 - 1 - 0 - indent 2 - 1 --folding 8 hh -+folding 9 ii - 3 cc -+7 gg -+8 hh - expr 2 - 1 - 2 - 0 ---- vim72.orig/src/testdir/test54.in -+++ vim72/src/testdir/test54.in -@@ -1,12 +1,17 @@ - Some tests for buffer-local autocommands - - STARTTEST - :so small.vim - :e xx --:!rm -f test.out --:au BufLeave <buffer> :!echo buffer-local autommand in %>> test.out -+:if has("vms") -+: !del test.out.* -+: au BufLeave <buffer> :!write sys$output "buffer-local autommand in %" > test.out -+:else -+: !rm -f test.out -+: au BufLeave <buffer> :!echo buffer-local autommand in %>> test.out -+:endif - :e somefile " here, autocommand for xx shall write test.out - : " but autocommand shall not apply to buffer named <buffer> - :bwipe xx " here, autocommand shall be auto-deleted - :e xx " nothing shall be written - :e somefile " nothing shall be written ---- /dev/null -+++ vim72/src/testdir/test66.in -@@ -0,0 +1,25 @@ -+ -+Test for visual block shift and tab characters. -+ -+STARTTEST -+:so small.vim -+/^abcdefgh -+4jI j<<11|D -+7|a -+7|a -+7|a 4k13|4j< -+:$-4,$w! test.out -+:$-4,$s/\s\+//g -+4kI j<< -+7|a -+7|a -+7|a 4k13|4j3< -+:$-4,$w >> test.out -+:qa! -+ENDTEST -+ -+abcdefghijklmnopqrstuvwxyz -+abcdefghijklmnopqrstuvwxyz -+abcdefghijklmnopqrstuvwxyz -+abcdefghijklmnopqrstuvwxyz -+abcdefghijklmnopqrstuvwxyz ---- /dev/null -+++ vim72/src/testdir/test66.ok -@@ -0,0 +1,10 @@ -+ abcdefghijklmnopqrstuvwxyz -+abcdefghij -+ abc defghijklmnopqrstuvwxyz -+ abc defghijklmnopqrstuvwxyz -+ abc defghijklmnopqrstuvwxyz -+ abcdefghijklmnopqrstuvwxyz -+abcdefghij -+ abc defghijklmnopqrstuvwxyz -+ abc defghijklmnopqrstuvwxyz -+ abc defghijklmnopqrstuvwxyz ---- /dev/null -+++ vim72/src/testdir/test67.in -@@ -0,0 +1,33 @@ -+Test that groups and patterns are tested correctly when calling exists() for -+autocommands. -+ -+STARTTEST -+:so small.vim -+:let results=[] -+:augroup auexists -+:augroup END -+:call add(results, "##BufEnter: " . exists("##BufEnter")) -+:call add(results, "#BufEnter: " . exists("#BufEnter")) -+:au BufEnter * let g:entered=1 -+:call add(results, "#BufEnter: " . exists("#BufEnter")) -+:call add(results, "#auexists#BufEnter: " . exists("#auexists#BufEnter")) -+:augroup auexists -+:au BufEnter * let g:entered=1 -+:augroup END -+:call add(results, "#auexists#BufEnter: " . exists("#auexists#BufEnter")) -+:call add(results, "#BufEnter#*.test: " . exists("#BufEnter#*.test")) -+:au BufEnter *.test let g:entered=1 -+:call add(results, "#BufEnter#*.test: " . exists("#BufEnter#*.test")) -+:edit testfile.test -+:call add(results, "#BufEnter#<buffer>: " . exists("#BufEnter#<buffer>")) -+:au BufEnter <buffer> let g:entered=1 -+:call add(results, "#BufEnter#<buffer>: " . exists("#BufEnter#<buffer>")) -+:edit testfile2.test -+:call add(results, "#BufEnter#<buffer>: " . exists("#BufEnter#<buffer>")) -+:e test.out -+:call append(0, results) -+:$d -+:w -+:qa! -+ENDTEST -+ ---- /dev/null -+++ vim72/src/testdir/test67.ok -@@ -0,0 +1,10 @@ -+##BufEnter: 1 -+#BufEnter: 0 -+#BufEnter: 1 -+#auexists#BufEnter: 0 -+#auexists#BufEnter: 1 -+#BufEnter#*.test: 0 -+#BufEnter#*.test: 1 -+#BufEnter#<buffer>: 0 -+#BufEnter#<buffer>: 1 -+#BufEnter#<buffer>: 0 ---- /dev/null -+++ vim72/src/testdir/test68.in -@@ -0,0 +1,56 @@ -+Test for text formatting. -+ -+Results of test68: -+ -+STARTTEST -+:so small.vim -+/^{/+1 -+:set noai tw=2 fo=t -+gRa b -+ENDTEST -+ -+{ -+ -+ -+} -+ -+STARTTEST -+/^{/+1 -+:set ai tw=2 fo=tw -+gqgqjjllab -+ENDTEST -+ -+{ -+a b -+ -+a -+} -+ -+STARTTEST -+/^{/+1 -+:set tw=3 fo=t -+gqgqo -+a -+ENDTEST -+ -+{ -+a -+} -+ -+STARTTEST -+/^{/+1 -+:set tw=2 fo=tcq1 comments=:# -+gqgqjgqgqo -+a b -+#a b -+ENDTEST -+ -+{ -+a b -+#a b -+} -+ -+STARTTEST -+:g/^STARTTEST/.,/^ENDTEST/d -+:1;/^Results/,$wq! test.out -+ENDTEST ---- /dev/null -+++ vim72/src/testdir/test68.ok -@@ -0,0 +1,35 @@ -+Results of test68: -+ -+ -+{ -+a -+b -+} -+ -+ -+{ -+a -+b -+ -+a -+b -+} -+ -+ -+{ -+a -+ -+ -+a -+ -+} -+ -+ -+{ -+a b -+#a b -+ -+a b -+#a b -+} -+ ---- /dev/null -+++ vim72/src/testdir/test69.in -@@ -0,0 +1,139 @@ -+Test for multi-byte text formatting. -+ -+STARTTEST -+:so mbyte.vim -+:set encoding=utf-8 -+ENDTEST -+ -+Results of test69: -+ -+STARTTEST -+/^{/+1 -+:set tw=2 fo=t -+gqgqjgqgqo -+XYZ -+abc XYZ -+ENDTEST -+ -+{ -+XYZ -+abc XYZ -+} -+ -+STARTTEST -+/^{/+1 -+:set tw=1 fo=tm -+gqgqjgqgqjgqgqjgqgqjgqgqo -+X -+Xa -+X a -+XY -+X ï¼¹ -+ENDTEST -+ -+{ -+X -+Xa -+X a -+XY -+X ï¼¹ -+} -+ -+STARTTEST -+/^{/+1 -+:set tw=2 fo=tm -+gqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqo -+X -+Xa -+X a -+XY -+X ï¼¹ -+aX -+abX -+abcX -+abX c -+abXY -+ENDTEST -+ -+{ -+X -+Xa -+X a -+XY -+X ï¼¹ -+aX -+abX -+abcX -+abX c -+abXY -+} -+ -+STARTTEST -+/^{/+1 -+:set ai tw=2 fo=tm -+gqgqjgqgqo -+X -+Xa -+ENDTEST -+ -+{ -+ X -+ Xa -+} -+ -+STARTTEST -+/^{/+1 -+:set noai tw=2 fo=tm -+gqgqjgqgqo -+ X -+ Xa -+ENDTEST -+ -+{ -+ X -+ Xa -+} -+ -+STARTTEST -+/^{/+1 -+:set tw=2 fo=cqm comments=n:X -+gqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqo -+X -+Xa -+Xaï¼¹ -+XY -+XYZ -+X ï¼¹ -+X YZ -+XX -+XXa -+XXY -+ENDTEST -+ -+{ -+X -+Xa -+Xaï¼¹ -+XY -+XYZ -+X ï¼¹ -+X YZ -+XX -+XXa -+XXY -+} -+ -+STARTTEST -+/^{/+1 -+:set tw=2 fo=tm -+RXa -+ENDTEST -+ -+{ -+ -+} -+ -+STARTTEST -+:g/^STARTTEST/.,/^ENDTEST/d -+:1;/^Results/,$wq! test.out -+ENDTEST ---- /dev/null -+++ vim72/src/testdir/test69.ok -@@ -0,0 +1,142 @@ -+Results of test69: -+ -+ -+{ -+XYZ -+abc -+XYZ -+ -+XYZ -+abc -+XYZ -+} -+ -+ -+{ -+X -+X -+a -+X -+a -+X -+ï¼¹ -+X -+ï¼¹ -+ -+X -+X -+a -+X -+a -+X -+ï¼¹ -+X -+ï¼¹ -+} -+ -+ -+{ -+X -+X -+a -+X -+a -+X -+ï¼¹ -+X -+ï¼¹ -+a -+X -+ab -+X -+abc -+X -+ab -+X -+c -+ab -+X -+ï¼¹ -+ -+X -+X -+a -+X -+a -+X -+ï¼¹ -+X -+ï¼¹ -+a -+X -+ab -+X -+abc -+X -+ab -+X -+c -+ab -+X -+ï¼¹ -+} -+ -+ -+{ -+ X -+ X -+ a -+ -+ X -+ X -+ a -+} -+ -+ -+{ -+ X -+ X -+a -+ -+ X -+ X -+a -+} -+ -+ -+{ -+X -+Xa -+Xa -+XY -+XY -+XY -+XZ -+X ï¼¹ -+X ï¼¹ -+X Z -+XX -+XXa -+XXY -+ -+X -+Xa -+Xa -+XY -+XY -+XY -+XZ -+X ï¼¹ -+X ï¼¹ -+X Z -+XX -+XXa -+XXY -+} -+ -+ -+{ -+X -+a -+} -+ ---- /dev/null -+++ vim72/src/testdir/test70.in -@@ -0,0 +1,53 @@ -+Smoke test for MzScheme interface and mzeval() function -+ -+STARTTEST -+:so mzscheme.vim -+:set nocompatible viminfo+=nviminfo -+:function! MzRequire() -+:redir => l:mzversion -+:mz (version) -+:redir END -+:if strpart(l:mzversion, 1, 1) < "4" -+:" MzScheme versions < 4.x: -+:mz (require (prefix vim- vimext)) -+:else -+:" newer versions: -+:mz (require (prefix-in vim- 'vimext)) -+:mz (require r5rs) -+:endif -+:endfunction -+:silent call MzRequire() -+:mz (define l '("item0" "dictionary with list OK" "item2")) -+:mz (define h (make-hash)) -+:mz (hash-set! h "list" l) -+/^1 -+:" change buffer contents -+:mz (vim-set-buff-line (vim-eval "line('.')") "1 changed line 1") -+:" scalar test -+:let tmp_string = mzeval('"string"') -+:let tmp_1000 = mzeval('1000') -+:if tmp_string . tmp_1000 == "string1000" -+:let scalar_res = "OK" -+:else -+:let scalar_res = "FAILED" -+:endif -+:call append(search("^1"), "scalar test " . scalar_res) -+:" dictionary containing a list -+:let tmp = mzeval("h")["list"][1] -+:/^2/put =tmp -+:" circular list (at the same time test lists containing lists) -+:mz (set-car! (cddr l) l) -+:let l2 = mzeval("h")["list"] -+:if l2[2] == l2 -+:let res = "OK" -+:else -+:let res = "FAILED" -+:endif -+:call setline(search("^3"), "circular test " . res) -+:?^1?,$w! test.out -+:qa! -+ENDTEST -+ -+1 line 1 -+2 line 2 -+3 line 3 ---- /dev/null -+++ vim72/src/testdir/test70.ok -@@ -0,0 +1,5 @@ -+1 changed line 1 -+scalar test OK -+2 line 2 -+dictionary with list OK -+circular test OK ---- vim72.orig/src/ui.c -+++ vim72/src/ui.c -@@ -318,14 +318,13 @@ ui_get_shellsize() - /* - * Set the size of the Vim shell according to Rows and Columns, if possible. - * The gui_set_shellsize() or mch_set_shellsize() function will try to set the - * new size. If this is not possible, it will adjust Rows and Columns. - */ --/*ARGSUSED*/ - void - ui_set_shellsize(mustset) -- int mustset; /* set by the user */ -+ int mustset UNUSED; /* set by the user */ - { - #ifdef FEAT_GUI - if (gui.in_use) - gui_set_shellsize(mustset, - # ifdef WIN3264 -@@ -1125,14 +1124,13 @@ clip_invert_rectangle(row, col, height, - /* - * Copy the currently selected area into the '*' register so it will be - * available for pasting. - * When "both" is TRUE also copy to the '+' register. - */ --/*ARGSUSED*/ - void - clip_copy_modeless_selection(both) -- int both; -+ int both UNUSED; - { - char_u *buffer; - char_u *bufp; - int row; - int start_col; -@@ -1699,14 +1697,13 @@ read_from_input_buf(buf, maxlen) - if (inbufcount) - mch_memmove(inbuf, inbuf + maxlen, (size_t)inbufcount); - return (int)maxlen; - } - --/*ARGSUSED*/ - void - fill_input_buf(exit_on_error) -- int exit_on_error; -+ int exit_on_error UNUSED; - { - #if defined(UNIX) || defined(OS2) || defined(VMS) || defined(MACOS_X_UNIX) - int len; - int try; - static int did_read_something = FALSE; -@@ -1818,11 +1815,11 @@ fill_input_buf(exit_on_error) - * what it was. */ - settmode(TMODE_COOK); - #ifdef HAVE_DUP - /* Use stderr for stdin, also works for shell commands. */ - close(0); -- dup(2); -+ ignored = dup(2); - #else - read_cmd_fd = 2; /* read from stderr instead of stdin */ - #endif - settmode(m); - } -@@ -1990,15 +1987,14 @@ x11_setup_atoms(dpy) - * X Selection stuff, for cutting and pasting text to other windows. - */ - - static void clip_x11_request_selection_cb __ARGS((Widget, XtPointer, Atom *, Atom *, XtPointer, long_u *, int *)); - --/* ARGSUSED */ - static void - clip_x11_request_selection_cb(w, success, sel_atom, type, value, length, - format) -- Widget w; -+ Widget w UNUSED; - XtPointer success; - Atom *sel_atom; - Atom *type; - XtPointer value; - long_u *length; -@@ -2018,11 +2014,11 @@ clip_x11_request_selection_cb(w, success - else - cbd = &clip_star; - - if (value == NULL || *length == 0) - { -- clip_free_selection(cbd); /* ??? [what's the query?] */ -+ clip_free_selection(cbd); /* nothing received, clear register */ - *(int *)success = FALSE; - return; - } - motion_type = MCHAR; - p = (char_u *)value; -@@ -2074,11 +2070,11 @@ clip_x11_request_selection_cb(w, success - int status; - - text_prop.value = (unsigned char *)value; - text_prop.encoding = *type; - text_prop.format = *format; -- text_prop.nitems = STRLEN(value); -+ text_prop.nitems = len; - status = XmbTextPropertyToTextList(X_DISPLAY, &text_prop, - &text_list, &n_text); - if (status != Success || n_text < 1) - { - *(int *)success = FALSE; -@@ -2106,12 +2102,12 @@ clip_x11_request_selection(myShell, dpy, - { - XEvent event; - Atom type; - static int success; - int i; -- int nbytes = 0; -- char_u *buffer; -+ time_t start_time; -+ int timed_out = FALSE; - - for (i = - #ifdef FEAT_MBYTE - 0 - #else -@@ -2127,10 +2123,11 @@ clip_x11_request_selection(myShell, dpy, - case 1: type = vim_atom; break; - case 2: type = compound_text_atom; break; - case 3: type = text_atom; break; - default: type = XA_STRING; - } -+ success = MAYBE; - XtGetSelectionValue(myShell, cbd->sel_atom, type, - clip_x11_request_selection_cb, (XtPointer)&success, CurrentTime); - - /* Make sure the request for the selection goes out before waiting for - * a response. */ -@@ -2139,51 +2136,63 @@ clip_x11_request_selection(myShell, dpy, - /* - * Wait for result of selection request, otherwise if we type more - * characters, then they will appear before the one that requested the - * paste! Don't worry, we will catch up with any other events later. - */ -- for (;;) -+ start_time = time(NULL); -+ while (success == MAYBE) - { -- if (XCheckTypedEvent(dpy, SelectionNotify, &event)) -- break; -- if (XCheckTypedEvent(dpy, SelectionRequest, &event)) -- /* We may get a SelectionRequest here and if we don't handle -- * it we hang. KDE klipper does this, for example. */ -+ if (XCheckTypedEvent(dpy, SelectionNotify, &event) -+ || XCheckTypedEvent(dpy, SelectionRequest, &event) -+ || XCheckTypedEvent(dpy, PropertyNotify, &event)) -+ { -+ /* This is where clip_x11_request_selection_cb() should be -+ * called. It may actually happen a bit later, so we loop -+ * until "success" changes. -+ * We may get a SelectionRequest here and if we don't handle -+ * it we hang. KDE klipper does this, for example. -+ * We need to handle a PropertyNotify for large selections. */ - XtDispatchEvent(&event); -+ continue; -+ } -+ -+ /* Time out after 2 to 3 seconds to avoid that we hang when the -+ * other process doesn't respond. Note that the SelectionNotify -+ * event may still come later when the selection owner comes back -+ * to life and the text gets inserted unexpectedly. Don't know -+ * why that happens or how to avoid that :-(. */ -+ if (time(NULL) > start_time + 2) -+ { -+ timed_out = TRUE; -+ break; -+ } - - /* Do we need this? Probably not. */ - XSync(dpy, False); - -- /* Bernhard Walle solved a slow paste response in an X terminal by -- * adding: usleep(10000); here. */ -+ /* Wait for 1 msec to avoid that we eat up all CPU time. */ -+ ui_delay(1L, TRUE); - } - -- /* this is where clip_x11_request_selection_cb() is actually called */ -- XtDispatchEvent(&event); -- -- if (success) -+ if (success == TRUE) - return; -+ -+ /* don't do a retry with another type after timing out, otherwise we -+ * hang for 15 seconds. */ -+ if (timed_out) -+ break; - } - - /* Final fallback position - use the X CUT_BUFFER0 store */ -- buffer = (char_u *)XFetchBuffer(dpy, &nbytes, 0); -- if (nbytes > 0) -- { -- /* Got something */ -- clip_yank_selection(MCHAR, buffer, (long)nbytes, cbd); -- XFree((void *)buffer); -- if (p_verbose > 0) -- verb_msg((char_u *)_("Used CUT_BUFFER0 instead of empty selection")); -- } -+ yank_cut_buffer0(dpy, cbd); - } - - static Boolean clip_x11_convert_selection_cb __ARGS((Widget, Atom *, Atom *, Atom *, XtPointer *, long_u *, int *)); - --/* ARGSUSED */ - static Boolean - clip_x11_convert_selection_cb(w, sel_atom, target, type, value, length, format) -- Widget w; -+ Widget w UNUSED; - Atom *sel_atom; - Atom *target; - Atom *type; - XtPointer *value; - long_u *length; -@@ -2306,14 +2315,13 @@ clip_x11_convert_selection_cb(w, sel_ato - return True; - } - - static void clip_x11_lose_ownership_cb __ARGS((Widget, Atom *)); - --/* ARGSUSED */ - static void - clip_x11_lose_ownership_cb(w, sel_atom) -- Widget w; -+ Widget w UNUSED; - Atom *sel_atom; - { - if (*sel_atom == clip_plus.sel_atom) - clip_lose_selection(&clip_plus); - else -@@ -2342,18 +2350,71 @@ clip_x11_own_selection(myShell, cbd) - - /* - * Send the current selection to the clipboard. Do nothing for X because we - * will fill in the selection only when requested by another app. - */ --/*ARGSUSED*/ - void - clip_x11_set_selection(cbd) -- VimClipboard *cbd; -+ VimClipboard *cbd UNUSED; - { - } - #endif - -+#if defined(FEAT_XCLIPBOARD) || defined(FEAT_GUI_X11) \ -+ || defined(FEAT_GUI_GTK) || defined(PROTO) -+/* -+ * Get the contents of the X CUT_BUFFER0 and put it in "cbd". -+ */ -+ void -+yank_cut_buffer0(dpy, cbd) -+ Display *dpy; -+ VimClipboard *cbd; -+{ -+ int nbytes = 0; -+ char_u *buffer = (char_u *)XFetchBuffer(dpy, &nbytes, 0); -+ -+ if (nbytes > 0) -+ { -+#ifdef FEAT_MBYTE -+ int done = FALSE; -+ -+ /* CUT_BUFFER0 is supposed to be always latin1. Convert to 'enc' when -+ * using a multi-byte encoding. Conversion between two 8-bit -+ * character sets usually fails and the text might actually be in -+ * 'enc' anyway. */ -+ if (has_mbyte) -+ { -+ char_u *conv_buf; -+ vimconv_T vc; -+ -+ vc.vc_type = CONV_NONE; -+ if (convert_setup(&vc, (char_u *)"latin1", p_enc) == OK) -+ { -+ conv_buf = string_convert(&vc, buffer, &nbytes); -+ if (conv_buf != NULL) -+ { -+ clip_yank_selection(MCHAR, conv_buf, (long)nbytes, cbd); -+ vim_free(conv_buf); -+ done = TRUE; -+ } -+ convert_setup(&vc, NULL, NULL); -+ } -+ } -+ if (!done) /* use the text without conversion */ -+#endif -+ clip_yank_selection(MCHAR, buffer, (long)nbytes, cbd); -+ XFree((void *)buffer); -+ if (p_verbose > 0) -+ { -+ verbose_enter(); -+ verb_msg((char_u *)_("Used CUT_BUFFER0 instead of empty selection")); -+ verbose_leave(); -+ } -+ } -+} -+#endif -+ - #if defined(FEAT_MOUSE) || defined(PROTO) - - /* - * Move the cursor to the specified row and column on the screen. - * Change current window if necessary. Returns an integer with the -@@ -2535,18 +2596,11 @@ retnomove: - #endif - #ifdef FEAT_CMDWIN - if (cmdwin_type != 0 && wp != curwin) - { - /* A click outside the command-line window: Use modeless -- * selection if possible. Allow dragging the status line of -- * windows just above the command-line window. */ -- if (wp->w_winrow + wp->w_height -- != curwin->w_prev->w_winrow + curwin->w_prev->w_height) -- { -- on_status_line = 0; -- dragwin = NULL; -- } -+ * selection if possible. Allow dragging the status lines. */ - # ifdef FEAT_VERTSPLIT - on_sep_line = 0; - # endif - # ifdef FEAT_CLIPBOARD - if (on_status_line) -@@ -2896,15 +2950,14 @@ mouse_comp_pos(win, rowp, colp, lnump) - #if defined(FEAT_WINDOWS) || defined(PROTO) - /* - * Find the window at screen position "*rowp" and "*colp". The positions are - * updated to become relative to the top-left of the window. - */ --/*ARGSUSED*/ - win_T * - mouse_find_win(rowp, colp) - int *rowp; -- int *colp; -+ int *colp UNUSED; - { - frame_T *fp; - - fp = topframe; - *rowp -= firstwin->w_winrow; -@@ -2993,22 +3046,21 @@ vcol2col(wp, lnum, vcol) - win_T *wp; - linenr_T lnum; - int vcol; - { - /* try to advance to the specified column */ -- int col = 0; - int count = 0; - char_u *ptr; -+ char_u *start; - -- ptr = ml_get_buf(wp->w_buffer, lnum, FALSE); -+ start = ptr = ml_get_buf(wp->w_buffer, lnum, FALSE); - while (count <= vcol && *ptr != NUL) - { -- ++col; - count += win_lbr_chartabsize(wp, ptr, count, NULL); - mb_ptr_adv(ptr); - } -- return col; -+ return (int)(ptr - start); - } - #endif - - #endif /* FEAT_MOUSE */ - ---- vim72.orig/src/version.c -+++ vim72/src/version.c -@@ -492,10 +492,15 @@ static char *(features[]) = - #ifdef FEAT_SNIFF - "+sniff", - #else - "-sniff", - #endif -+#ifdef STARTUPTIME -+ "+startuptime", -+#else -+ "-startuptime", -+#endif - #ifdef FEAT_STL_OPT - "+statusline", - #else - "-statusline", - #endif -@@ -675,13 +680,848 @@ static char *(features[]) = - }; - - static int included_patches[] = - { /* Add new patch number below this line */ - /**/ -+ 411, -+/**/ -+ 410, -+/**/ -+ 409, -+/**/ -+ 408, -+/**/ -+ 407, -+/**/ -+ 406, -+/**/ -+ 405, -+/**/ -+ 404, -+/**/ -+ 403, -+/**/ -+ 402, -+/**/ -+ 401, -+/**/ -+ 400, -+/**/ -+ 399, -+/**/ -+ 398, -+/**/ -+ 397, -+/**/ -+ 396, -+/**/ -+ 395, -+/**/ -+ 394, -+/**/ -+ 393, -+/**/ -+ 392, -+/**/ -+ 391, -+/**/ -+ 390, -+/**/ -+ 389, -+/**/ -+ 388, -+/**/ -+ 387, -+/**/ -+ 386, -+/**/ -+ 385, -+/**/ -+ 384, -+/**/ -+ 383, -+/**/ -+ 382, -+/**/ -+ 381, -+/**/ -+ 380, -+/**/ -+ 379, -+/**/ -+ 378, -+/**/ -+ 377, -+/**/ -+ 376, -+/**/ -+ 375, -+/**/ -+ 374, -+/**/ -+ 373, -+/**/ -+ 372, -+/**/ -+ 371, -+/**/ -+ 370, -+/**/ -+ 369, -+/**/ -+ 368, -+/**/ -+ 367, -+/**/ -+ 366, -+/**/ -+ 365, -+/**/ -+ 364, -+/**/ -+ 363, -+/**/ -+ 362, -+/**/ -+ 361, -+/**/ -+ 360, -+/**/ -+ 359, -+/**/ -+ 358, -+/**/ -+ 357, -+/**/ -+ 356, -+/**/ -+ 355, -+/**/ -+ 354, -+/**/ -+ 353, -+/**/ -+ 352, -+/**/ -+ 351, -+/**/ -+ 350, -+/**/ -+ 349, -+/**/ -+ 348, -+/**/ -+ 347, -+/**/ -+ 346, -+/**/ -+ 345, -+/**/ -+ 344, -+/**/ -+ 343, -+/**/ -+ 342, -+/**/ -+ 341, -+/**/ -+ 340, -+/**/ -+ 339, -+/**/ -+ 338, -+/**/ -+ 337, -+/**/ -+ 336, -+/**/ -+ 335, -+/**/ -+ 334, -+/**/ -+ 333, -+/**/ -+ 332, -+/**/ -+ 331, -+/**/ -+ 330, -+/**/ -+ 329, -+/**/ -+ 328, -+/**/ -+ 327, -+/**/ -+ 326, -+/**/ -+ 325, -+/**/ -+ 324, -+/**/ -+ 323, -+/**/ -+ 322, -+/**/ -+ 321, -+/**/ -+ 320, -+/**/ -+ 319, -+/**/ -+ 318, -+/**/ -+ 317, -+/**/ -+ 316, -+/**/ -+ 315, -+/**/ -+ 314, -+/**/ -+ 313, -+/**/ -+ 312, -+/**/ -+ 311, -+/**/ -+ 310, -+/**/ -+ 309, -+/**/ -+ 308, -+/**/ -+ 307, -+/**/ -+ 306, -+/**/ -+ 305, -+/**/ -+ 304, -+/**/ -+ 303, -+/**/ -+ 302, -+/**/ -+ 301, -+/**/ -+ 300, -+/**/ -+ 299, -+/**/ -+ 298, -+/**/ -+ 297, -+/**/ -+ 296, -+/**/ -+ 295, -+/**/ -+ 294, -+/**/ -+ 293, -+/**/ -+ 292, -+/**/ -+ 291, -+/**/ -+ 290, -+/**/ -+ 289, -+/**/ -+ 288, -+/**/ -+ 287, -+/**/ -+ 286, -+/**/ -+ 285, -+/**/ -+ 284, -+/**/ -+ 283, -+/**/ -+ 282, -+/**/ -+ 281, -+/**/ -+ 280, -+/**/ -+ 279, -+/**/ -+ 278, -+/**/ -+ 277, -+/**/ -+ 276, -+/**/ -+ 275, -+/**/ -+ 274, -+/**/ -+ 273, -+/**/ -+ 272, -+/**/ -+ 271, -+/**/ -+ 270, -+/**/ -+ 269, -+/**/ -+ 268, -+/**/ -+ 267, -+/**/ -+ 266, -+/**/ -+ 265, -+/**/ -+ 264, -+/**/ -+ 263, -+/**/ -+ 262, -+/**/ -+ 261, -+/**/ -+ 260, -+/**/ -+ 259, -+/**/ -+ 258, -+/**/ -+ 257, -+/**/ -+ 256, -+/**/ -+ 255, -+/**/ -+ 254, -+/**/ -+ 253, -+/**/ -+ 252, -+/**/ -+ 251, -+/**/ -+ 250, -+/**/ -+ 249, -+/**/ -+ 248, -+/**/ -+ 247, -+/**/ -+ 246, -+/**/ -+ 245, -+/**/ -+ 244, -+/**/ -+ 243, -+/**/ -+ 242, -+/**/ -+ 241, -+/**/ -+ 240, -+/**/ -+ 239, -+/**/ -+ 238, -+/**/ -+ 237, -+/**/ -+ 236, -+/**/ -+ 235, -+/**/ -+ 234, -+/**/ -+ 233, -+/**/ -+ 232, -+/**/ -+ 231, -+/**/ -+ 230, -+/**/ -+ 229, -+/**/ -+ 228, -+/**/ -+ 227, -+/**/ -+ 226, -+/**/ -+ 225, -+/**/ -+ 224, -+/**/ -+ 223, -+/**/ -+ 222, -+/**/ -+ 221, -+/**/ -+ 220, -+/**/ -+ 219, -+/**/ -+ 218, -+/**/ -+ 217, -+/**/ -+ 216, -+/**/ -+ 215, -+/**/ -+ 214, -+/**/ -+ 213, -+/**/ -+ 212, -+/**/ -+ 211, -+/**/ -+ 210, -+/**/ -+ 209, -+/**/ -+ 208, -+/**/ -+ 207, -+/**/ -+ 206, -+/**/ -+ 205, -+/**/ -+ 204, -+/**/ -+ 203, -+/**/ -+ 202, -+/**/ -+ 201, -+/**/ -+ 200, -+/**/ -+ 199, -+/**/ -+ 198, -+/**/ -+ 197, -+/**/ -+ 196, -+/**/ -+ 195, -+/**/ -+ 194, -+/**/ -+ 193, -+/**/ -+ 192, -+/**/ -+ 191, -+/**/ -+ 190, -+/**/ -+ 189, -+/**/ -+ 188, -+/**/ -+ 187, -+/**/ -+ 186, -+/**/ -+ 185, -+/**/ -+ 184, -+/**/ -+ 183, -+/**/ -+ 182, -+/**/ -+ 181, -+/**/ -+ 180, -+/**/ -+ 179, -+/**/ -+ 178, -+/**/ -+ 177, -+/**/ -+ 176, -+/**/ -+ 175, -+/**/ -+ 174, -+/**/ -+ 173, -+/**/ -+ 172, -+/**/ -+ 171, -+/**/ -+ 170, -+/**/ -+ 169, -+/**/ -+ 168, -+/**/ -+ 167, -+/**/ -+ 166, -+/**/ -+ 165, -+/**/ -+ 164, -+/**/ -+ 163, -+/**/ -+ 162, -+/**/ -+ 161, -+/**/ -+ 160, -+/**/ -+ 159, -+/**/ -+ 158, -+/**/ -+ 157, -+/**/ -+ 156, -+/**/ -+ 155, -+/**/ -+ 154, -+/**/ -+ 153, -+/**/ -+ 152, -+/**/ -+ 151, -+/**/ -+ 150, -+/**/ -+ 149, -+/**/ -+ 148, -+/**/ -+ 147, -+/**/ -+ 146, -+/**/ -+ 145, -+/**/ -+ 144, -+/**/ -+ 143, -+/**/ -+ 142, -+/**/ -+ 141, -+/**/ -+ 140, -+/**/ -+ 139, -+/**/ -+ 138, -+/**/ -+ 137, -+/**/ -+ 136, -+/**/ -+ 135, -+/**/ -+ 134, -+/**/ -+ 133, -+/**/ -+ 132, -+/**/ -+ 131, -+/**/ -+ 130, -+/**/ -+ 129, -+/**/ -+ 128, -+/**/ -+ 127, -+/**/ -+ 126, -+/**/ -+ 125, -+/**/ -+ 124, -+/**/ -+ 123, -+/**/ -+ 122, -+/**/ -+ 121, -+/**/ -+ 120, -+/**/ -+ 119, -+/**/ -+ 118, -+/**/ -+ 117, -+/**/ -+ 116, -+/**/ -+ 115, -+/**/ -+ 114, -+/**/ -+ 113, -+/**/ -+ 112, -+/**/ -+ 111, -+/**/ -+ 110, -+/**/ -+ 109, -+/**/ -+ 108, -+/**/ -+ 107, -+/**/ -+ 106, -+/**/ -+ 105, -+/**/ -+ 104, -+/**/ -+ 103, -+/**/ -+ 102, -+/**/ -+ 101, -+/**/ -+ 100, -+/**/ -+ 99, -+/**/ -+ 98, -+/**/ -+ 97, -+/**/ -+ 96, -+/**/ -+ 95, -+/**/ -+ 94, -+/**/ -+ 93, -+/**/ -+ 92, -+/**/ -+ 91, -+/**/ -+ 90, -+/**/ -+ 89, -+/**/ -+ 88, -+/**/ -+ 87, -+/**/ -+ 86, -+/**/ -+ 85, -+/**/ -+ 84, -+/**/ -+ 83, -+/**/ -+ 82, -+/**/ -+ 81, -+/**/ -+ 80, -+/**/ -+ 79, -+/**/ -+ 78, -+/**/ -+ 77, -+/**/ -+ 76, -+/**/ -+ 75, -+/**/ -+ 74, -+/**/ -+ 73, -+/**/ -+ 72, -+/**/ -+ 71, -+/**/ -+ 70, -+/**/ -+ 69, -+/**/ -+ 68, -+/**/ -+ 67, -+/**/ -+ 66, -+/**/ -+ 65, -+/**/ -+ 64, -+/**/ -+ 63, -+/**/ -+ 62, -+/**/ -+ 61, -+/**/ -+ 60, -+/**/ -+ 59, -+/**/ -+ 58, -+/**/ -+ 57, -+/**/ -+ 56, -+/**/ -+ 55, -+/**/ -+ 54, -+/**/ -+ 53, -+/**/ -+ 52, -+/**/ -+ 51, -+/**/ -+ 50, -+/**/ -+ 49, -+/**/ -+ 48, -+/**/ -+ 47, -+/**/ -+ 46, -+/**/ -+ 45, -+/**/ -+ 44, -+/**/ -+ 43, -+/**/ -+ 42, -+/**/ -+ 41, -+/**/ -+ 40, -+/**/ -+ 39, -+/**/ -+ 38, -+/**/ -+ 37, -+/**/ -+ 36, -+/**/ -+ 35, -+/**/ -+ 34, -+/**/ -+ 33, -+/**/ -+ 32, -+/**/ -+ 31, -+/**/ -+ 30, -+/**/ -+ 29, -+/**/ -+ 28, -+/**/ -+ 27, -+/**/ -+ 26, -+/**/ -+ 25, -+/**/ -+ 24, -+/**/ -+ 23, -+/**/ -+ 22, -+/**/ -+ 21, -+/**/ -+ 20, -+/**/ -+ 19, -+/**/ -+ 18, -+/**/ -+ 17, -+/**/ -+ 16, -+/**/ -+ 15, -+/**/ -+ 14, -+/**/ -+ 13, -+/**/ -+ 12, -+/**/ -+ 11, -+/**/ -+ 10, -+/**/ -+ 9, -+/**/ -+ 8, -+/**/ -+ 7, -+/**/ -+ 6, -+/**/ -+ 5, -+/**/ -+ 4, -+/**/ -+ 3, -+/**/ -+ 2, -+/**/ -+ 1, -+/**/ - 0 - }; - -+/* -+ * Place to put a short description when adding a feature with a patch. -+ * Keep it short, e.g.,: "relative numbers", "persistent undo". -+ * Also add a comment marker to separate the lines. -+ * See the official Vim patches for the diff format: It must use a context of -+ * one line only. Create it by hand or use "diff -C2" and edit the patch. -+ */ -+static char *(extra_patches[]) = -+{ /* Add your patch description below this line */ -+/**/ -+ NULL -+}; -+ - int - highest_patch() - { - int i; - int h = 0; -@@ -784,11 +1624,11 @@ list_version() - - #ifdef RISCOS - MSG_PUTS(_("\nRISC OS version")); - #endif - #ifdef VMS -- MSG_PUTS("\nOpenVMS version"); -+ MSG_PUTS(_("\nOpenVMS version")); - # ifdef HAVE_PATHDEF - if (*compiled_arch != NUL) - { - MSG_PUTS(" - "); - MSG_PUTS(compiled_arch); -@@ -823,10 +1663,23 @@ list_version() - first = -1; - } - } - } - -+ /* Print the list of extra patch descriptions if there is at least one. */ -+ if (extra_patches[0] != NULL) -+ { -+ MSG_PUTS(_("\nExtra patches: ")); -+ s = ""; -+ for (i = 0; extra_patches[i] != NULL; ++i) -+ { -+ MSG_PUTS(s); -+ s = ", "; -+ MSG_PUTS(extra_patches[i]); -+ } -+ } -+ - #ifdef MODIFIED_BY - MSG_PUTS("\n"); - MSG_PUTS(_("Modified by ")); - MSG_PUTS(MODIFIED_BY); - #endif -@@ -1251,14 +2104,13 @@ do_intro_line(row, mesg, add_version, at - } - - /* - * ":intro": clear screen, display intro screen and wait for return. - */ --/*ARGSUSED*/ - void - ex_intro(eap) -- exarg_T *eap; -+ exarg_T *eap UNUSED; - { - screenclear(); - intro_message(TRUE); - wait_return(TRUE); - } ---- vim72.orig/src/vim.h -+++ vim72/src/vim.h -@@ -50,11 +50,13 @@ - # endif - #endif - - /* user ID of root is usually zero, but not for everybody */ - #ifdef __TANDEM --# define _TANDEM_SOURCE -+# ifndef _TANDEM_SOURCE -+# define _TANDEM_SOURCE -+# endif - # include <floss.h> - # define ROOT_UID 65535 - #else - # define ROOT_UID 0 - #endif -@@ -260,10 +262,18 @@ - /* __ARGS and __PARMS are the same thing. */ - #ifndef __PARMS - # define __PARMS(x) __ARGS(x) - #endif - -+/* Mark unused function arguments with UNUSED, so that gcc -Wunused-parameter -+ * can be used to check for mistakes. */ -+#ifdef HAVE_ATTRIBUTE_UNUSED -+# define UNUSED __attribute__((unused)) -+#else -+# define UNUSED -+#endif -+ - /* if we're compiling in C++ (currently only KVim), the system - * headers must have the correct prototypes or nothing will build. - * conversely, our prototypes might clash due to throw() specifiers and - * cause compilation failures even though the headers are correct. For - * a concrete example, gcc-3.2 enforces exception specifications, and -@@ -339,12 +349,18 @@ - # endif - #endif - #ifdef BACKSLASH_IN_FILENAME - # define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`%#'\"|!<") - #else --# define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<") --# define SHELL_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<>();&") -+# ifdef VMS -+ /* VMS allows a lot of characters in the file name */ -+# define PATH_ESC_CHARS ((char_u *)" \t\n*?{`\\%#'\"|!") -+# define SHELL_ESC_CHARS ((char_u *)" \t\n*?{`\\%#'|!()&") -+# else -+# define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<") -+# define SHELL_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<>();&") -+# endif - #endif - - #define NUMBUFLEN 30 /* length of a buffer to store a number in ASCII */ - - /* -@@ -368,11 +384,11 @@ typedef __int64 long_i; - * that change size between 32-bit and 64-bit platforms. For any such type, - * __w64 should appear only on the 32-bit definition of the typedef. - * Define __w64 as an empty token for everything but MSVC 7.x or later. - */ - # if !defined(_MSC_VER) || (_MSC_VER < 1300) --# define __w64 -+# define __w64 - # endif - typedef unsigned long __w64 long_u; - typedef long __w64 long_i; - # define SCANF_HEX_LONG_U "%lx" - # define SCANF_DECIMAL_LONG_U "%lu" -@@ -459,10 +475,27 @@ typedef unsigned long u8char_T; /* l - #endif - #ifdef HAVE_STDARG_H - # include <stdarg.h> - #endif - -+# if defined(HAVE_SYS_SELECT_H) && \ -+ (!defined(HAVE_SYS_TIME_H) || defined(SYS_SELECT_WITH_SYS_TIME)) -+# include <sys/select.h> -+# endif -+ -+# ifndef HAVE_SELECT -+# ifdef HAVE_SYS_POLL_H -+# include <sys/poll.h> -+# define HAVE_POLL -+# else -+# ifdef HAVE_POLL_H -+# include <poll.h> -+# define HAVE_POLL -+# endif -+# endif -+# endif -+ - /* ================ end of the header file puzzle =============== */ - - /* - * For dynamically loaded imm library. Currently, only for Win32. - */ -@@ -577,11 +610,11 @@ extern char *(*dyn_libintl_textdomain)(c - #define VALID_BOTLINE_AP 0x40 /* w_botine is approximated */ - #define VALID_TOPLINE 0x80 /* w_topline is valid (for cursor position) */ - - /* - * Terminal highlighting attribute bits. -- * Attibutes above HL_ALL are used for syntax highlighting. -+ * Attributes above HL_ALL are used for syntax highlighting. - */ - #define HL_NORMAL 0x00 - #define HL_INVERSE 0x01 - #define HL_BOLD 0x02 - #define HL_ITALIC 0x04 -@@ -700,10 +733,14 @@ extern char *(*dyn_libintl_textdomain)(c - #define EXPAND_COLORS 28 - #define EXPAND_COMPILER 29 - #define EXPAND_USER_DEFINED 30 - #define EXPAND_USER_LIST 31 - #define EXPAND_SHELLCMD 32 -+#define EXPAND_CSCOPE 33 -+#define EXPAND_SIGN 34 -+#define EXPAND_PROFILE 35 -+#define EXPAND_BEHAVE 36 - - /* Values for exmode_active (0 is no exmode) */ - #define EXMODE_NORMAL 1 - #define EXMODE_VIM 2 - -@@ -1049,10 +1086,11 @@ extern char *(*dyn_libintl_textdomain)(c - #define WSP_TOP 4 /* window at top-left of shell */ - #define WSP_BOT 8 /* window at bottom-right of shell */ - #define WSP_HELP 16 /* creating the help window */ - #define WSP_BELOW 32 /* put new window below/right */ - #define WSP_ABOVE 64 /* put new window above/left */ -+#define WSP_NEWLOC 128 /* don't copy location list */ - - /* - * arguments for gui_set_shellsize() - */ - #define RESIZE_VERT 1 /* resize vertically */ -@@ -1240,11 +1278,11 @@ typedef enum - , HLF_CUL /* 'cursurline' */ - , HLF_COUNT /* MUST be the last one */ - } hlf_T; - - /* The HL_FLAGS must be in the same order as the HLF_ enums! -- * When chainging this also adjust the default for 'highlight'. */ -+ * When changing this also adjust the default for 'highlight'. */ - #define HL_FLAGS {'8', '@', 'd', 'e', 'h', 'i', 'l', 'm', 'M', \ - 'n', 'r', 's', 'S', 'c', 't', 'v', 'V', 'w', 'W', \ - 'f', 'F', 'A', 'C', 'D', 'T', '>', \ - 'B', 'P', 'R', 'L', \ - '+', '=', 'x', 'X', '*', '#', '_', '!', '.'} -@@ -1326,15 +1364,15 @@ typedef enum - #else - # define MSG_BUF_LEN 80 /* length of buffer for small messages */ - # define MSG_BUF_CLEN MSG_BUF_LEN /* cell length */ - #endif - --#if defined(AMIGA) || defined(__linux__) || defined(__QNX__) || defined(__CYGWIN32__) || defined(_AIX) --# define TBUFSZ 2048 /* buffer size for termcap entry */ --#else --# define TBUFSZ 1024 /* buffer size for termcap entry */ --#endif -+/* Size of the buffer used for tgetent(). Unfortunately this is largely -+ * undocumented, some systems use 1024. Using a buffer that is too small -+ * causes a buffer overrun and a crash. Use the maximum known value to stay -+ * on the safe side. */ -+#define TBUFSZ 2048 /* buffer size for termcap entry */ - - /* - * Maximum length of key sequence to be mapped. - * Must be able to hold an Amiga resize report. - */ -@@ -1408,11 +1446,11 @@ typedef enum - #endif - - #ifdef FEAT_MBYTE - /* We need to call mb_stricmp() even when we aren't dealing with a multi-byte - * encoding because mb_stricmp() takes care of all ascii and non-ascii -- * encodings, including characters with umluats in latin1, etc., while -+ * encodings, including characters with umlauts in latin1, etc., while - * STRICMP() only handles the system locale version, which often does not - * handle non-ascii properly. */ - - # define MB_STRICMP(d, s) mb_strnicmp((char_u *)(d), (char_u *)(s), (int)MAXCOL) - # define MB_STRNICMP(d, s, n) mb_strnicmp((char_u *)(d), (char_u *)(s), (int)(n)) -@@ -1449,12 +1487,12 @@ typedef enum - # define PERROR(msg) (void)emsg3((char_u *)"%s: %s", (char_u *)msg, (char_u *)strerror(errno)) - #else - # define PERROR(msg) perror(msg) - #endif - --typedef long linenr_T; /* line number type */ --typedef unsigned colnr_T; /* column number type */ -+typedef long linenr_T; /* line number type */ -+typedef int colnr_T; /* column number type */ - typedef unsigned short disptick_T; /* display tick type */ - - #define MAXLNUM (0x7fffffffL) /* maximum (invalid) line number */ - - /* -@@ -1726,11 +1764,12 @@ typedef int proftime_T; /* dummy for - #define VV_MOUSE_WIN 49 - #define VV_MOUSE_LNUM 50 - #define VV_MOUSE_COL 51 - #define VV_OP 52 - #define VV_SEARCHFORWARD 53 --#define VV_LEN 54 /* number of v: vars */ -+#define VV_OLDFILES 54 -+#define VV_LEN 55 /* number of v: vars */ - - #ifdef FEAT_CLIPBOARD - - /* VIM_ATOM_NAME is the older Vim-specific selection type for X11. Still - * supported for when a mix of Vim versions is used. VIMENC_ATOM_NAME includes -@@ -1977,10 +2016,13 @@ typedef int VimClipboard; /* This is req - # else - # define X_DISPLAY xterm_dpy - # endif - #endif - -+#ifndef FEAT_NETBEANS_INTG -+# undef NBDEBUG -+#endif - #ifdef NBDEBUG /* Netbeans debugging. */ - # include "nbdebug.h" - #else - # define nbdebug(a) - #endif -@@ -2052,6 +2094,12 @@ typedef int VimClipboard; /* This is req - /* last argument for do_source() */ - #define DOSO_NONE 0 - #define DOSO_VIMRC 1 /* loading vimrc file */ - #define DOSO_GVIMRC 2 /* loading gvimrc file */ - -+/* flags for read_viminfo() and children */ -+#define VIF_WANT_INFO 1 /* load non-mark info */ -+#define VIF_WANT_MARKS 2 /* load file marks */ -+#define VIF_FORCEIT 4 /* overwrite info already read */ -+#define VIF_GET_OLDFILES 8 /* load v:oldfiles */ -+ - #endif /* VIM__H */ ---- vim72.orig/src/window.c -+++ vim72/src/window.c -@@ -9,24 +9,24 @@ - - #include "vim.h" - - static int path_is_url __ARGS((char_u *p)); - #if defined(FEAT_WINDOWS) || defined(PROTO) --static int win_split_ins __ARGS((int size, int flags, win_T *newwin, int dir)); --static void win_init __ARGS((win_T *newp, win_T *oldp)); -+static void win_init __ARGS((win_T *newp, win_T *oldp, int flags)); -+static void win_init_some __ARGS((win_T *newp, win_T *oldp)); - static void frame_comp_pos __ARGS((frame_T *topfrp, int *row, int *col)); - static void frame_setheight __ARGS((frame_T *curfrp, int height)); - #ifdef FEAT_VERTSPLIT - static void frame_setwidth __ARGS((frame_T *curfrp, int width)); - #endif - static void win_exchange __ARGS((long)); - static void win_rotate __ARGS((int, int)); - static void win_totop __ARGS((int size, int flags)); - static void win_equal_rec __ARGS((win_T *next_curwin, int current, frame_T *topfr, int dir, int col, int row, int width, int height)); - static int last_window __ARGS((void)); -+static int one_window __ARGS((void)); - static win_T *win_free_mem __ARGS((win_T *win, int *dirp, tabpage_T *tp)); --static win_T *winframe_remove __ARGS((win_T *win, int *dirp, tabpage_T *tp)); - static frame_T *win_altframe __ARGS((win_T *win, tabpage_T *tp)); - static tabpage_T *alt_tabpage __ARGS((void)); - static win_T *frame2win __ARGS((frame_T *frp)); - static int frame_has_win __ARGS((frame_T *frp, win_T *wp)); - static void frame_new_height __ARGS((frame_T *topfrp, int height, int topfirst, int wfh)); -@@ -39,20 +39,19 @@ static void frame_add_vsep __ARGS((frame - static int frame_minwidth __ARGS((frame_T *topfrp, win_T *next_curwin)); - static void frame_fix_width __ARGS((win_T *wp)); - #endif - #endif - static int win_alloc_firstwin __ARGS((win_T *oldwin)); -+static void new_frame __ARGS((win_T *wp)); - #if defined(FEAT_WINDOWS) || defined(PROTO) - static tabpage_T *alloc_tabpage __ARGS((void)); - static int leave_tabpage __ARGS((buf_T *new_curbuf)); - static void enter_tabpage __ARGS((tabpage_T *tp, buf_T *old_curbuf)); - static void frame_fix_height __ARGS((win_T *wp)); - static int frame_minheight __ARGS((frame_T *topfrp, win_T *next_curwin)); - static void win_enter_ext __ARGS((win_T *wp, int undo_sync, int no_curwin)); - static void win_free __ARGS((win_T *wp, tabpage_T *tp)); --static void win_append __ARGS((win_T *, win_T *)); --static void win_remove __ARGS((win_T *, tabpage_T *tp)); - static void frame_append __ARGS((frame_T *after, frame_T *frp)); - static void frame_insert __ARGS((frame_T *before, frame_T *frp)); - static void frame_remove __ARGS((frame_T *frp)); - #ifdef FEAT_VERTSPLIT - static void win_new_width __ARGS((win_T *wp, int width)); -@@ -60,21 +59,19 @@ static void win_goto_ver __ARGS((int up, - static void win_goto_hor __ARGS((int left, long count)); - #endif - static void frame_add_height __ARGS((frame_T *frp, int n)); - static void last_status_rec __ARGS((frame_T *fr, int statusline)); - --static void make_snapshot __ARGS((void)); - static void make_snapshot_rec __ARGS((frame_T *fr, frame_T **frp)); --static void clear_snapshot __ARGS((tabpage_T *tp)); -+static void clear_snapshot __ARGS((tabpage_T *tp, int idx)); - static void clear_snapshot_rec __ARGS((frame_T *fr)); --static void restore_snapshot __ARGS((int close_curwin)); - static int check_snapshot_rec __ARGS((frame_T *sn, frame_T *fr)); - static win_T *restore_snapshot_rec __ARGS((frame_T *sn, frame_T *fr)); - - #endif /* FEAT_WINDOWS */ - --static win_T *win_alloc __ARGS((win_T *after)); -+static win_T *win_alloc __ARGS((win_T *after, int hidden)); - static void win_new_height __ARGS((win_T *, int)); - - #define URL_SLASH 1 /* path_is_url() has found "://" */ - #define URL_BACKSLASH 2 /* path_is_url() has found ":\\" */ - -@@ -257,11 +254,11 @@ newwindow: - case Ctrl_W: - case 'w': - /* cursor to previous window with wrap around */ - case 'W': - CHECK_CMDWIN -- if (lastwin == firstwin && Prenum != 1) /* just one window */ -+ if (firstwin == lastwin && Prenum != 1) /* just one window */ - beep_flush(); - else - { - if (Prenum) /* go to specified window */ - { -@@ -341,11 +338,11 @@ newwindow: - break; - #endif - - /* move window to new tab page */ - case 'T': -- if (firstwin == lastwin) -+ if (one_window()) - MSG(_(m_onlyone)); - else - { - tabpage_T *oldtab = curtab; - tabpage_T *newtab; -@@ -529,11 +526,12 @@ wingotofile: - if (win_split(0, 0) == OK) - { - # ifdef FEAT_SCROLLBIND - curwin->w_p_scb = FALSE; - # endif -- (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LASTL, ECMD_HIDE); -+ (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LASTL, -+ ECMD_HIDE, NULL); - if (nchar == 'F' && lnum >= 0) - { - curwin->w_cursor.lnum = lnum; - check_cursor_lnum(); - beginline(BL_SOL | BL_FIX); -@@ -591,13 +589,11 @@ wingotofile: - #endif - ++no_mapping; - ++allow_keys; /* no mapping for xchar, but allow key codes */ - if (xchar == NUL) - xchar = plain_vgetc(); --#ifdef FEAT_LANGMAP - LANGMAP_ADJUST(xchar, TRUE); --#endif - --no_mapping; - --allow_keys; - #ifdef FEAT_CMDL_INFO - (void)add_to_showcmd(xchar); - #endif -@@ -628,11 +624,11 @@ wingotofile: - break; - - #ifdef FEAT_SEARCHPATH - case 'f': /* CTRL-W gf: "gf" in a new tab page */ - case 'F': /* CTRL-W gF: "gF" in a new tab page */ -- cmdmod.tab = TRUE; -+ cmdmod.tab = tabpage_index(curtab) + 1; - nchar = xchar; - goto wingotofile; - #endif - default: - beep_flush(); -@@ -678,24 +674,24 @@ win_split(size, flags) - } - - /* When creating the help window make a snapshot of the window layout. - * Otherwise clear the snapshot, it's now invalid. */ - if (flags & WSP_HELP) -- make_snapshot(); -+ make_snapshot(SNAP_HELP_IDX); - else -- clear_snapshot(curtab); -+ clear_snapshot(curtab, SNAP_HELP_IDX); - - return win_split_ins(size, flags, NULL, 0); - } - - /* - * When "newwin" is NULL: split the current window in two. - * When "newwin" is not NULL: insert this window at the far - * top/left/right/bottom. - * return FAIL for failure, OK otherwise - */ -- static int -+ int - win_split_ins(size, flags, newwin, dir) - int size; - int flags; - win_T *newwin; - int dir; -@@ -892,29 +888,36 @@ win_split_ins(size, flags, newwin, dir) - #endif - p_sb)))) - { - /* new window below/right of current one */ - if (newwin == NULL) -- wp = win_alloc(oldwin); -+ wp = win_alloc(oldwin, FALSE); - else - win_append(oldwin, wp); - } - else - { - if (newwin == NULL) -- wp = win_alloc(oldwin->w_prev); -+ wp = win_alloc(oldwin->w_prev, FALSE); - else - win_append(oldwin->w_prev, wp); - } - - if (newwin == NULL) - { - if (wp == NULL) - return FAIL; - -+ new_frame(wp); -+ if (wp->w_frame == NULL) -+ { -+ win_free(wp, NULL); -+ return FAIL; -+ } -+ - /* make the contents of the new window the same as the current one */ -- win_init(wp, curwin); -+ win_init(wp, curwin, flags); - } - - /* - * Reorganise the tree of frames to insert the new window. - */ -@@ -969,17 +972,11 @@ win_split_ins(size, flags, newwin, dir) - for (frp = frp->fr_child; frp != NULL; frp = frp->fr_next) - frp->fr_parent = curfrp; - } - - if (newwin == NULL) -- { -- /* Create a frame for the new window. */ -- frp = (frame_T *)alloc_clear((unsigned)sizeof(frame_T)); -- frp->fr_layout = FR_LEAF; -- frp->fr_win = wp; -- wp->w_frame = frp; -- } -+ frp = wp->w_frame; - else - frp = newwin->w_frame; - frp->fr_parent = curfrp->fr_parent; - - /* Insert the new frame at the right place in the frame list. */ -@@ -992,32 +989,32 @@ win_split_ins(size, flags, newwin, dir) - if (flags & WSP_VERT) - { - wp->w_p_scr = curwin->w_p_scr; - if (need_status) - { -- --oldwin->w_height; -+ win_new_height(oldwin, oldwin->w_height - 1); - oldwin->w_status_height = need_status; - } - if (flags & (WSP_TOP | WSP_BOT)) - { - /* set height and row of new window to full height */ - wp->w_winrow = tabline_height(); -- wp->w_height = curfrp->fr_height - (p_ls > 0); -+ win_new_height(wp, curfrp->fr_height - (p_ls > 0)); - wp->w_status_height = (p_ls > 0); - } - else - { - /* height and row of new window is same as current window */ - wp->w_winrow = oldwin->w_winrow; -- wp->w_height = oldwin->w_height; -+ win_new_height(wp, oldwin->w_height); - wp->w_status_height = oldwin->w_status_height; - } - frp->fr_height = curfrp->fr_height; - - /* "new_size" of the current window goes to the new window, use - * one column for the vertical separator */ -- wp->w_width = new_size; -+ win_new_width(wp, new_size); - if (before) - wp->w_vsep_width = 1; - else - { - wp->w_vsep_width = oldwin->w_vsep_width; -@@ -1050,17 +1047,17 @@ win_split_ins(size, flags, newwin, dir) - /* width and column of new window is same as current window */ - #ifdef FEAT_VERTSPLIT - if (flags & (WSP_TOP | WSP_BOT)) - { - wp->w_wincol = 0; -- wp->w_width = Columns; -+ win_new_width(wp, Columns); - wp->w_vsep_width = 0; - } - else - { - wp->w_wincol = oldwin->w_wincol; -- wp->w_width = oldwin->w_width; -+ win_new_width(wp, oldwin->w_width); - wp->w_vsep_width = oldwin->w_vsep_width; - } - frp->fr_width = curfrp->fr_width; - #endif - -@@ -1112,11 +1109,11 @@ win_split_ins(size, flags, newwin, dir) - msg_row = Rows - 1; - msg_col = 0; /* put position back at start of line */ - } - - /* -- * make the new window the current window and redraw -+ * equalize the window sizes. - */ - if (do_equal || dir != 0) - win_equal(wp, TRUE, - #ifdef FEAT_VERTSPLIT - (flags & WSP_VERT) ? (dir == 'v' ? 'b' : 'h') -@@ -1144,10 +1141,14 @@ win_split_ins(size, flags, newwin, dir) - { - i = p_wh; - if (size != 0) - p_wh = size; - } -+ -+ /* -+ * make the new window the current window -+ */ - win_enter(wp, FALSE); - #ifdef FEAT_VERTSPLIT - if (flags & WSP_VERT) - p_wiw = i; - else -@@ -1155,19 +1156,23 @@ win_split_ins(size, flags, newwin, dir) - p_wh = i; - - return OK; - } - -+ - /* - * Initialize window "newp" from window "oldp". - * Used when splitting a window and when creating a new tab page. - * The windows will both edit the same buffer. -+ * WSP_NEWLOC may be specified in flags to prevent the location list from -+ * being copied. - */ - static void --win_init(newp, oldp) -+win_init(newp, oldp, flags) - win_T *newp; - win_T *oldp; -+ int flags UNUSED; - { - int i; - - newp->w_buffer = oldp->w_buffer; - oldp->w_buffer->b_nwindows++; -@@ -1188,36 +1193,55 @@ win_init(newp, oldp) - newp->w_prev_fraction_row = oldp->w_prev_fraction_row; - #ifdef FEAT_JUMPLIST - copy_jumplist(oldp, newp); - #endif - #ifdef FEAT_QUICKFIX -- copy_loclist(oldp, newp); -+ if (flags & WSP_NEWLOC) -+ { -+ /* Don't copy the location list. */ -+ newp->w_llist = NULL; -+ newp->w_llist_ref = NULL; -+ } -+ else -+ copy_loclist(oldp, newp); - #endif - if (oldp->w_localdir != NULL) - newp->w_localdir = vim_strsave(oldp->w_localdir); - -- /* Use the same argument list. */ -- newp->w_alist = oldp->w_alist; -- ++newp->w_alist->al_refcount; -- newp->w_arg_idx = oldp->w_arg_idx; -- -- /* -- * copy tagstack and options from existing window -- */ -+ /* copy tagstack and folds */ - for (i = 0; i < oldp->w_tagstacklen; i++) - { - newp->w_tagstack[i] = oldp->w_tagstack[i]; - if (newp->w_tagstack[i].tagname != NULL) - newp->w_tagstack[i].tagname = - vim_strsave(newp->w_tagstack[i].tagname); - } - newp->w_tagstackidx = oldp->w_tagstackidx; - newp->w_tagstacklen = oldp->w_tagstacklen; -- win_copy_options(oldp, newp); - # ifdef FEAT_FOLDING - copyFoldingState(oldp, newp); - # endif -+ -+ win_init_some(newp, oldp); -+} -+ -+/* -+ * Initialize window "newp" from window"old". -+ * Only the essential things are copied. -+ */ -+ static void -+win_init_some(newp, oldp) -+ win_T *newp; -+ win_T *oldp; -+{ -+ /* Use the same argument list. */ -+ newp->w_alist = oldp->w_alist; -+ ++newp->w_alist->al_refcount; -+ newp->w_arg_idx = oldp->w_arg_idx; -+ -+ /* copy options from existing window */ -+ win_copy_options(oldp, newp); - } - - #endif /* FEAT_WINDOWS */ - - #if defined(FEAT_WINDOWS) || defined(PROTO) -@@ -1256,15 +1280,14 @@ win_count() - * Make "count" windows on the screen. - * Return actual number of windows on the screen. - * Must be called when there is just one window, filling the whole screen - * (excluding the command line). - */ --/*ARGSUSED*/ - int - make_windows(count, vertical) - int count; -- int vertical; /* split windows vertically if TRUE */ -+ int vertical UNUSED; /* split windows vertically if TRUE */ - { - int maxcount; - int todo; - - #ifdef FEAT_VERTSPLIT -@@ -1555,19 +1578,12 @@ win_totop(size, flags) - } - - #if defined(FEAT_GUI) && defined(FEAT_VERTSPLIT) - /* When 'guioptions' includes 'L' or 'R' may have to remove or add - * scrollbars. Have to update them anyway. */ -- if (gui.in_use) -- { -- out_flush(); -- gui_init_which_components(NULL); -- gui_update_scrollbars(TRUE); -- } -- need_mouse_correct = TRUE; -+ gui_may_update_scrollbars(); - #endif -- - } - - /* - * Move window "win1" to below/right of "win2" and make "win1" the current - * window. Only works within the same frame! -@@ -2038,17 +2054,44 @@ close_windows(buf, keep_curwin) - if (h != tabline_height()) - shell_new_rows(); - } - - /* -- * Return TRUE if the current window is the only window that exists. -+ * Return TRUE if the current window is the only window that exists (ignoring -+ * "aucmd_win"). - * Returns FALSE if there is a window, possibly in another tab page. - */ - static int - last_window() - { -- return (lastwin == firstwin && first_tabpage->tp_next == NULL); -+ return (one_window() && first_tabpage->tp_next == NULL); -+} -+ -+/* -+ * Return TRUE if there is only one window other than "aucmd_win" in the -+ * current tab page. -+ */ -+ static int -+one_window() -+{ -+#ifdef FEAT_AUTOCMD -+ win_T *wp; -+ int seen_one = FALSE; -+ -+ FOR_ALL_WINDOWS(wp) -+ { -+ if (wp != aucmd_win) -+ { -+ if (seen_one) -+ return FALSE; -+ seen_one = TRUE; -+ } -+ } -+ return TRUE; -+#else -+ return firstwin == lastwin; -+#endif - } - - /* - * Close window "win". Only works for the current tab page. - * If "free_buf" is TRUE related buffer may be unloaded. -@@ -2073,10 +2116,23 @@ win_close(win, free_buf) - { - EMSG(_("E444: Cannot close last window")); - return; - } - -+#ifdef FEAT_AUTOCMD -+ if (win == aucmd_win) -+ { -+ EMSG(_("E813: Cannot close autocmd window")); -+ return; -+ } -+ if ((firstwin == aucmd_win || lastwin == aucmd_win) && one_window()) -+ { -+ EMSG(_("E814: Cannot close window, only autocmd window would remain")); -+ return; -+ } -+#endif -+ - /* - * When closing the last window in a tab page first go to another tab - * page and then close the window and the tab page. This avoids that - * curwin and curtab are not invalid while we are freeing memory, they may - * be used in GUI events. -@@ -2102,11 +2158,11 @@ win_close(win, free_buf) - /* When closing the help window, try restoring a snapshot after closing - * the window. Otherwise clear the snapshot, it's now invalid. */ - if (win->w_buffer->b_help) - help_window = TRUE; - else -- clear_snapshot(curtab); -+ clear_snapshot(curtab, SNAP_HELP_IDX); - - #ifdef FEAT_AUTOCMD - if (win == curwin) - { - /* -@@ -2219,11 +2275,11 @@ win_close(win, free_buf) - last_status(FALSE); - - /* After closing the help window, try restoring the window layout from - * before it was opened. */ - if (help_window) -- restore_snapshot(close_curwin); -+ restore_snapshot(SNAP_HELP_IDX, close_curwin); - - #if defined(FEAT_GUI) && defined(FEAT_VERTSPLIT) - /* When 'guioptions' includes 'L' or 'R' may have to remove scrollbars. */ - if (gui.in_use && !win_hasvertsplit()) - gui_init_which_components(NULL); -@@ -2300,17 +2356,10 @@ win_free_mem(win, dirp, tp) - tabpage_T *tp; /* tab page "win" is in, NULL for current */ - { - frame_T *frp; - win_T *wp; - --#ifdef FEAT_FOLDING -- clearFolding(win); --#endif -- -- /* reduce the reference count to the argument list. */ -- alist_unlink(win->w_alist); -- - /* Remove the window and its frame from the tree of frames. */ - frp = win->w_frame; - wp = winframe_remove(win, dirp, tp); - vim_free(frp); - win_free(win, tp); -@@ -2332,24 +2381,31 @@ win_free_all() - # ifdef FEAT_WINDOWS - while (first_tabpage->tp_next != NULL) - tabpage_close(TRUE); - # endif - -+# ifdef FEAT_AUTOCMD -+ if (aucmd_win != NULL) -+ { -+ (void)win_free_mem(aucmd_win, &dummy, NULL); -+ aucmd_win = NULL; -+ } -+# endif -+ - while (firstwin != NULL) - (void)win_free_mem(firstwin, &dummy, NULL); - } - #endif - - /* - * Remove a window and its frame from the tree of frames. - * Returns a pointer to the window that got the freed up space. - */ --/*ARGSUSED*/ -- static win_T * -+ win_T * - winframe_remove(win, dirp, tp) - win_T *win; -- int *dirp; /* set to 'v' or 'h' for direction if 'ea' */ -+ int *dirp UNUSED; /* set to 'v' or 'h' for direction if 'ea' */ - tabpage_T *tp; /* tab page "win" is in, NULL for current */ - { - frame_T *frp, *frp2, *frp3; - frame_T *frp_close = win->w_frame; - win_T *wp; -@@ -3081,11 +3137,11 @@ close_others(message, forceit) - { - win_T *wp; - win_T *nextwp; - int r; - -- if (lastwin == firstwin) -+ if (one_window()) - { - if (message - #ifdef FEAT_AUTOCMD - && !autocmd_busy - #endif -@@ -3143,31 +3199,38 @@ close_others(message, forceit) - * Called when a new file is being edited. - */ - void - curwin_init() - { -- redraw_win_later(curwin, NOT_VALID); -- curwin->w_lines_valid = 0; -- curwin->w_cursor.lnum = 1; -- curwin->w_curswant = curwin->w_cursor.col = 0; -+ win_init_empty(curwin); -+} -+ -+ void -+win_init_empty(wp) -+ win_T *wp; -+{ -+ redraw_win_later(wp, NOT_VALID); -+ wp->w_lines_valid = 0; -+ wp->w_cursor.lnum = 1; -+ wp->w_curswant = wp->w_cursor.col = 0; - #ifdef FEAT_VIRTUALEDIT -- curwin->w_cursor.coladd = 0; -+ wp->w_cursor.coladd = 0; - #endif -- curwin->w_pcmark.lnum = 1; /* pcmark not cleared but set to line 1 */ -- curwin->w_pcmark.col = 0; -- curwin->w_prev_pcmark.lnum = 0; -- curwin->w_prev_pcmark.col = 0; -- curwin->w_topline = 1; -+ wp->w_pcmark.lnum = 1; /* pcmark not cleared but set to line 1 */ -+ wp->w_pcmark.col = 0; -+ wp->w_prev_pcmark.lnum = 0; -+ wp->w_prev_pcmark.col = 0; -+ wp->w_topline = 1; - #ifdef FEAT_DIFF -- curwin->w_topfill = 0; -+ wp->w_topfill = 0; - #endif -- curwin->w_botline = 2; -+ wp->w_botline = 2; - #ifdef FEAT_FKMAP -- if (curwin->w_p_rl) -- curwin->w_farsi = W_CONV + W_R_L; -+ if (wp->w_p_rl) -+ wp->w_farsi = W_CONV + W_R_L; - else -- curwin->w_farsi = W_CONV; -+ wp->w_farsi = W_CONV; - #endif - } - - /* - * Allocate the first window and put an empty buffer in it. -@@ -3185,13 +3248,34 @@ win_alloc_first() - if (first_tabpage == NULL) - return FAIL; - first_tabpage->tp_topframe = topframe; - curtab = first_tabpage; - #endif -+ - return OK; - } - -+#if defined(FEAT_AUTOCMD) || defined(PROTO) -+/* -+ * Init "aucmd_win". This can only be done after the first -+ * window is fully initialized, thus it can't be in win_alloc_first(). -+ */ -+ void -+win_alloc_aucmd_win() -+{ -+ aucmd_win = win_alloc(NULL, TRUE); -+ if (aucmd_win != NULL) -+ { -+ win_init_some(aucmd_win, curwin); -+# ifdef FEAT_SCROLLBIND -+ aucmd_win->w_p_scb = FALSE; -+# endif -+ new_frame(aucmd_win); -+ } -+} -+#endif -+ - /* - * Allocate the first window or the first window in a new tab page. - * When "oldwin" is NULL create an empty buffer for it. - * When "oldwin" is not NULL copy info from it to the new window (only with - * FEAT_WINDOWS). -@@ -3199,11 +3283,11 @@ win_alloc_first() - */ - static int - win_alloc_firstwin(oldwin) - win_T *oldwin; - { -- curwin = win_alloc(NULL); -+ curwin = win_alloc(NULL, FALSE); - if (oldwin == NULL) - { - /* Very first window, need to create an empty buffer for it and - * initialize from scratch. */ - curbuf = buflist_new(NULL, NULL, 1L, BLN_LISTED); -@@ -3218,34 +3302,49 @@ win_alloc_firstwin(oldwin) - } - #ifdef FEAT_WINDOWS - else - { - /* First window in new tab page, initialize it from "oldwin". */ -- win_init(curwin, oldwin); -+ win_init(curwin, oldwin, 0); - - # ifdef FEAT_SCROLLBIND - /* We don't want scroll-binding in the first window. */ - curwin->w_p_scb = FALSE; - # endif - } - #endif - -- topframe = (frame_T *)alloc_clear((unsigned)sizeof(frame_T)); -- if (topframe == NULL) -+ new_frame(curwin); -+ if (curwin->w_frame == NULL) - return FAIL; -- topframe->fr_layout = FR_LEAF; -+ topframe = curwin->w_frame; - #ifdef FEAT_VERTSPLIT - topframe->fr_width = Columns; - #endif - topframe->fr_height = Rows - p_ch; - topframe->fr_win = curwin; -- curwin->w_frame = topframe; - - return OK; - } - - /* -+ * Create a frame for window "wp". -+ */ -+ static void -+new_frame(win_T *wp) -+{ -+ frame_T *frp = (frame_T *)alloc_clear((unsigned)sizeof(frame_T)); -+ -+ wp->w_frame = frp; -+ if (frp != NULL) -+ { -+ frp->fr_layout = FR_LEAF; -+ frp->fr_win = wp; -+ } -+} -+ -+/* - * Initialize the window and frame size to the maximum. - */ - void - win_init_size() - { -@@ -3291,14 +3390,17 @@ alloc_tabpage() - - void - free_tabpage(tp) - tabpage_T *tp; - { -+ int idx; -+ - # ifdef FEAT_DIFF - diff_clear(tp); - # endif -- clear_snapshot(tp); -+ for (idx = 0; idx < SNAP_COUNT; ++idx) -+ clear_snapshot(tp, idx); - #ifdef FEAT_EVAL - vars_clear(&tp->tp_vars.dv_hashtab); /* free all t: variables */ - #endif - vim_free(tp); - } -@@ -3361,16 +3463,11 @@ win_new_tabpage(after) - last_status(FALSE); - - #if defined(FEAT_GUI) - /* When 'guioptions' includes 'L' or 'R' may have to remove or add - * scrollbars. Have to update them anyway. */ -- if (gui.in_use && starting == 0) -- { -- gui_init_which_components(NULL); -- gui_update_scrollbars(TRUE); -- } -- need_mouse_correct = TRUE; -+ gui_may_update_scrollbars(); - #endif - - redraw_all_later(CLEAR); - #ifdef FEAT_AUTOCMD - apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf); -@@ -3488,14 +3585,13 @@ tabpage_index(ftp) - * Prepare for leaving the current tab page. - * When autocomands change "curtab" we don't leave the tab page and return - * FAIL. - * Careful: When OK is returned need to get a new tab page very very soon! - */ --/*ARGSUSED*/ - static int - leave_tabpage(new_curbuf) -- buf_T *new_curbuf; /* what is going to be the new curbuf, -+ buf_T *new_curbuf UNUSED; /* what is going to be the new curbuf, - NULL if unknown */ - { - tabpage_T *tp = curtab; - - #ifdef FEAT_VISUAL -@@ -3533,15 +3629,14 @@ leave_tabpage(new_curbuf) - - /* - * Start using tab page "tp". - * Only to be used after leave_tabpage() or freeing the current tab page. - */ --/*ARGSUSED*/ - static void - enter_tabpage(tp, old_curbuf) - tabpage_T *tp; -- buf_T *old_curbuf; -+ buf_T *old_curbuf UNUSED; - { - int old_off = tp->tp_firstwin->w_winrow; - win_T *next_prevwin = tp->tp_prevwin; - - curtab = tp; -@@ -3586,16 +3681,11 @@ enter_tabpage(tp, old_curbuf) - #endif - - #if defined(FEAT_GUI) - /* When 'guioptions' includes 'L' or 'R' may have to remove or add - * scrollbars. Have to update them anyway. */ -- if (gui.in_use && starting == 0) -- { -- gui_init_which_components(NULL); -- gui_update_scrollbars(TRUE); -- } -- need_mouse_correct = TRUE; -+ gui_may_update_scrollbars(); - #endif - - redraw_all_later(CLEAR); - } - -@@ -4026,18 +4116,18 @@ win_enter_ext(wp, undo_sync, curwin_inva - char_u cwd[MAXPATHL]; - - if (mch_dirname(cwd, MAXPATHL) == OK) - globaldir = vim_strsave(cwd); - } -- mch_chdir((char *)curwin->w_localdir); -- shorten_fnames(TRUE); -+ if (mch_chdir((char *)curwin->w_localdir) == 0) -+ shorten_fnames(TRUE); - } - else if (globaldir != NULL) - { - /* Window doesn't have a local directory and we are not in the global - * directory: Change to the global directory. */ -- mch_chdir((char *)globaldir); -+ ignored = mch_chdir((char *)globaldir); - vim_free(globaldir); - globaldir = NULL; - shorten_fnames(TRUE); - } - -@@ -4143,16 +4233,17 @@ buf_jump_open_tab(buf) - # endif - } - #endif - - /* -- * allocate a window structure and link it in the window list -+ * Allocate a window structure and link it in the window list when "hidden" is -+ * FALSE. - */ --/*ARGSUSED*/ - static win_T * --win_alloc(after) -- win_T *after; -+win_alloc(after, hidden) -+ win_T *after UNUSED; -+ int hidden UNUSED; - { - win_T *newwin; - - /* - * allocate window structure and linesizes arrays -@@ -4174,11 +4265,12 @@ win_alloc(after) - #endif - /* - * link the window in the window list - */ - #ifdef FEAT_WINDOWS -- win_append(after, newwin); -+ if (!hidden) -+ win_append(after, newwin); - #endif - #ifdef FEAT_VERTSPLIT - newwin->w_wincol = 0; - newwin->w_width = Columns; - #endif -@@ -4235,10 +4327,17 @@ win_free(wp, tp) - win_T *wp; - tabpage_T *tp; /* tab page "win" is in, NULL for current */ - { - int i; - -+#ifdef FEAT_FOLDING -+ clearFolding(wp); -+#endif -+ -+ /* reduce the reference count to the argument list. */ -+ alist_unlink(wp->w_alist); -+ - #ifdef FEAT_AUTOCMD - /* Don't execute autocommands while the window is halfway being deleted. - * gui_mch_destroy_scrollbar() may trigger a FocusGained event. */ - block_autocmds(); - #endif -@@ -4297,22 +4396,25 @@ win_free(wp, tp) - gui_mch_destroy_scrollbar(&wp->w_scrollbars[SBAR_LEFT]); - gui_mch_destroy_scrollbar(&wp->w_scrollbars[SBAR_RIGHT]); - } - #endif /* FEAT_GUI */ - -- win_remove(wp, tp); -+#ifdef FEAT_AUTOCMD -+ if (wp != aucmd_win) -+#endif -+ win_remove(wp, tp); - vim_free(wp); - - #ifdef FEAT_AUTOCMD - unblock_autocmds(); - #endif - } - - /* - * Append window "wp" in the window list after window "after". - */ -- static void -+ void - win_append(after, wp) - win_T *after, *wp; - { - win_T *before; - -@@ -4334,11 +4436,11 @@ win_append(after, wp) - } - - /* - * Remove a window from the window list. - */ -- static void -+ void - win_remove(wp, tp) - win_T *wp; - tabpage_T *tp; /* tab page "win" is in, NULL for current */ - { - if (wp->w_prev != NULL) -@@ -6034,10 +6136,11 @@ min_rows() - } - - /* - * Return TRUE if there is only one window (in the current tab page), not - * counting a help or preview window, unless it is the current window. -+ * Does not count "aucmd_win". - */ - int - only_one_window() - { - #ifdef FEAT_WINDOWS -@@ -6047,15 +6150,19 @@ only_one_window() - /* If there is another tab page there always is another window. */ - if (first_tabpage->tp_next != NULL) - return FALSE; - - for (wp = firstwin; wp != NULL; wp = wp->w_next) -- if (!((wp->w_buffer->b_help && !curbuf->b_help) -+ if ((!((wp->w_buffer->b_help && !curbuf->b_help) - # ifdef FEAT_QUICKFIX - || wp->w_p_pvw - # endif - ) || wp == curwin) -+# ifdef FEAT_AUTOCMD -+ && wp != aucmd_win -+# endif -+ ) - ++count; - return (count <= 1); - #else - return TRUE; - #endif -@@ -6106,15 +6213,16 @@ check_lnums(do_curwin) - */ - - /* - * Create a snapshot of the current frame sizes. - */ -- static void --make_snapshot() -+ void -+make_snapshot(idx) -+ int idx; - { -- clear_snapshot(curtab); -- make_snapshot_rec(topframe, &curtab->tp_snapshot); -+ clear_snapshot(curtab, idx); -+ make_snapshot_rec(topframe, &curtab->tp_snapshot[idx]); - } - - static void - make_snapshot_rec(fr, frp) - frame_T *fr; -@@ -6138,15 +6246,16 @@ make_snapshot_rec(fr, frp) - - /* - * Remove any existing snapshot. - */ - static void --clear_snapshot(tp) -+clear_snapshot(tp, idx) - tabpage_T *tp; -+ int idx; - { -- clear_snapshot_rec(tp->tp_snapshot); -- tp->tp_snapshot = NULL; -+ clear_snapshot_rec(tp->tp_snapshot[idx]); -+ tp->tp_snapshot[idx] = NULL; - } - - static void - clear_snapshot_rec(fr) - frame_T *fr; -@@ -6162,30 +6271,31 @@ clear_snapshot_rec(fr) - /* - * Restore a previously created snapshot, if there is any. - * This is only done if the screen size didn't change and the window layout is - * still the same. - */ -- static void --restore_snapshot(close_curwin) -+ void -+restore_snapshot(idx, close_curwin) -+ int idx; - int close_curwin; /* closing current window */ - { - win_T *wp; - -- if (curtab->tp_snapshot != NULL -+ if (curtab->tp_snapshot[idx] != NULL - # ifdef FEAT_VERTSPLIT -- && curtab->tp_snapshot->fr_width == topframe->fr_width -+ && curtab->tp_snapshot[idx]->fr_width == topframe->fr_width - # endif -- && curtab->tp_snapshot->fr_height == topframe->fr_height -- && check_snapshot_rec(curtab->tp_snapshot, topframe) == OK) -+ && curtab->tp_snapshot[idx]->fr_height == topframe->fr_height -+ && check_snapshot_rec(curtab->tp_snapshot[idx], topframe) == OK) - { -- wp = restore_snapshot_rec(curtab->tp_snapshot, topframe); -+ wp = restore_snapshot_rec(curtab->tp_snapshot[idx], topframe); - win_comp_pos(); - if (wp != NULL && close_curwin) - win_goto(wp); - redraw_all_later(CLEAR); - } -- clear_snapshot(curtab); -+ clear_snapshot(curtab, idx); - } - - /* - * Check if frames "sn" and "fr" have the same layout, same following frames - * and same children. ---- vim72.orig/src/workshop.c -+++ vim72/src/workshop.c -@@ -54,16 +54,16 @@ static void load_buffer_by_name(char *, - static void load_buffer_by_number(int, int); - #endif - static void load_window(char *, int lnum); - static void warp_to_pc(int); - #ifdef FEAT_BEVAL --void workshop_beval_cb(BalloonEval *, int); -+void workshop_beval_cb(BalloonEval *, int); -+static int computeIndex(int, char_u *, int); - #endif - static char *fixAccelText(char *); - static void addMenu(char *, char *, char *); - static char *lookupVerb(char *, int); --static int computeIndex(int, char_u *, int); - static void coloncmd(char *, Boolean); - - extern Widget vimShell; - extern Widget textArea; - extern XtAppContext app_context; -@@ -202,16 +202,15 @@ workshop_get_editor_version() - * workshop_load_file - * - * Function: - * Load a given file into the WorkShop buffer. - */ --/*ARGSUSED*/ - void - workshop_load_file( - char *filename, /* the file to load */ - int line, /* an optional line number (or 0) */ -- char *frameid) /* used for multi-frame support */ -+ char *frameid UNUSED) /* used for multi-frame support */ - { - #ifdef WSDEBUG_TRACE - if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE)) - wstrace("workshop_load_file(%s, %d)\n", filename, line); - #endif -@@ -261,14 +260,13 @@ workshop_goto_line( - #endif - - load_window(filename, lineno); - } - --/*ARGSUSED*/ - void - workshop_front_file( -- char *filename) -+ char *filename UNUSED) - { - #ifdef WSDEBUG_TRACE - if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE)) - wstrace("workshop_front_file()\n"); - #endif -@@ -536,13 +534,12 @@ workshop_adjust_marks(Widget *window, in - * Are there any moved marks? If so, call workshop_move_mark on - * each of them now. This is how eserve can find out if for example - * breakpoints have moved when a program has been recompiled and - * reloaded into dbx. - */ --/*ARGSUSED*/ - void --workshop_moved_marks(char *filename) -+workshop_moved_marks(char *filename UNUSED) - { - #ifdef WSDEBUG_TRACE - if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE)) - wstrace("XXXworkshop_moved_marks(%s)\n", filename); - #endif -@@ -573,15 +570,14 @@ workshop_get_font_height() - } - - return (int)h; - } - --/*ARGSUSED*/ - void - workshop_footer_message( -- char *message, -- int severity) /* severity is currently unused */ -+ char *message, -+ int severity UNUSED) /* severity is currently unused */ - { - #ifdef WSDEBUG_TRACE - if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE)) - wstrace("workshop_footer_message(%s, %d)\n", message, severity); - #endif -@@ -685,19 +681,18 @@ workshop_submenu_end() - /* - * This is where menus are really made. Each item will generate an amenu vim - * command. The globals curMenuName and curMenuPriority contain the name and - * priority of the parent menu tree. - */ --/*ARGSUSED*/ - void - workshop_menu_item( - char *label, - char *verb, -- char *accelerator, -+ char *accelerator UNUSED, - char *acceleratorText, -- char *name, -- char *filepos, -+ char *name UNUSED, -+ char *filepos UNUSED, - char *sensitive) - { - char cbuf[BUFSIZ]; - char namebuf[BUFSIZ]; - char accText[BUFSIZ]; -@@ -808,17 +803,16 @@ workshop_toolbar_end() - set_option_value((char_u *)"go", 0L, buf, 0); - } - workshopInitDone = True; - } - --/*ARGSUSED*/ - void - workshop_toolbar_button( - char *label, - char *verb, -- char *senseVerb, -- char *filepos, -+ char *senseVerb UNUSED, -+ char *filepos UNUSED, - char *help, - char *sense, - char *file, - char *left) - { -@@ -966,11 +960,13 @@ workshop_set_option( - { - case 's': - if (strcmp(option, "syntax") == 0) - vim_snprintf(cbuf, sizeof(cbuf), "syntax %s", value); - else if (strcmp(option, "savefiles") == 0) -- ; /* XXX - Not yet implemented */ -+ { -+ /* XXX - Not yet implemented */ -+ } - break; - - case 'l': - if (strcmp(option, "lineno") == 0) - sprintf(cbuf, "set %snu", -@@ -1096,14 +1092,13 @@ workshop_hotkeys( - } - - /* - * A button in the toolbar has been pushed. - */ --/*ARGSUSED*/ - int - workshop_get_positions( -- void *clientData, /* unused */ -+ void *clientData UNUSED, - char **filename, /* output data */ - int *curLine, /* output data */ - int *curCol, /* output data */ - int *selStartLine, /* output data */ - int *selStartCol, /* output data */ -@@ -1119,12 +1114,16 @@ workshop_get_positions( - wstrace("workshop_get_positions(%#x, \"%s\", ...)\n", - clientData, (curbuf && curbuf->b_sfname != NULL) - ? (char *)curbuf->b_sfname : "<None>"); - #endif - -- strcpy(ffname, (char *) curbuf->b_ffname); -- *filename = ffname; /* copy so nobody can change b_ffname */ -+ if (curbuf->b_ffname == NULL) -+ ffname[0] = NUL; -+ else -+ /* copy so nobody can change b_ffname */ -+ strcpy(ffname, (char *) curbuf->b_ffname); -+ *filename = ffname; - *curLine = curwin->w_cursor.lnum; - *curCol = curwin->w_cursor.col; - - if (curbuf->b_visual.vi_mode == 'v' && - equalpos(curwin->w_cursor, curbuf->b_visual.vi_end)) -@@ -1520,13 +1519,12 @@ workshop_test_getselectedtext() - return selection; - else - return NULL; - } - --/*ARGSUSED*/ - void --workshop_save_sensitivity(char *filename) -+workshop_save_sensitivity(char *filename UNUSED) - { - } - - #endif - -@@ -1624,12 +1622,10 @@ workshop_beval_cb( - workshop_send_message(buf); - } - } - } - } --#endif -- - - static int - computeIndex( - int wantedCol, - char_u *line, -@@ -1649,10 +1645,11 @@ computeIndex( - return idx; - } - - return -1; - } -+#endif - - static void - addMenu( - char *menu, /* menu name */ - char *accel, /* accelerator text (optional) */ ---- vim72.orig/src/xxd/Make_cyg.mak -+++ vim72/src/xxd/Make_cyg.mak -@@ -10,18 +10,19 @@ LIBS = -lc - else - DEFINES = -mno-cygwin - LIBS = - endif - -+CC = gcc - CFLAGS = -O2 -Wall -DWIN32 $(DEFINES) - - ifneq (sh.exe, $(SHELL)) - DEL = rm - else - DEL = del - endif - - xxd.exe: xxd.c -- gcc $(CFLAGS) -s -o xxd.exe xxd.c $(LIBS) -+ $(CC) $(CFLAGS) -s -o xxd.exe xxd.c $(LIBS) - - clean: - -$(DEL) xxd.exe ---- vim72.orig/src/xxd/xxd.c -+++ vim72/src/xxd/xxd.c -@@ -62,10 +62,13 @@ - /* Visual Studio 2005 has 'deprecated' many of the standard CRT functions */ - #if _MSC_VER >= 1400 - # define _CRT_SECURE_NO_DEPRECATE - # define _CRT_NONSTDC_NO_DEPRECATE - #endif -+#if !defined(CYGWIN) && (defined(CYGWIN32) || defined(__CYGWIN__) || defined(__CYGWIN32__)) -+# define CYGWIN -+#endif - - #include <stdio.h> - #ifdef VAXC - # include <file.h> - #else -@@ -75,11 +78,12 @@ - # define MSDOS - #endif - #if !defined(OS2) && defined(__EMX__) - # define OS2 - #endif --#if defined(MSDOS) || defined(WIN32) || defined(OS2) || defined(__BORLANDC__) -+#if defined(MSDOS) || defined(WIN32) || defined(OS2) || defined(__BORLANDC__) \ -+ || defined(CYGWIN) - # include <io.h> /* for setmode() */ - #else - # ifdef UNIX - # include <unistd.h> - # endif -@@ -148,13 +152,10 @@ char osver[] = " (dos 16 bit)"; - char osver[] = ""; - # endif - # endif - #endif - --#if !defined(CYGWIN) && (defined(CYGWIN32) || defined(__CYGWIN__) || defined(__CYGWIN32__)) --# define CYGWIN --#endif - #if defined(MSDOS) || defined(WIN32) || defined(OS2) - # define BIN_READ(yes) ((yes) ? "rb" : "rt") - # define BIN_WRITE(yes) ((yes) ? "wb" : "wt") - # define BIN_CREAT(yes) ((yes) ? (O_CREAT|O_BINARY) : O_CREAT) - # define BIN_ASSIGN(fp, yes) setmode(fileno(fp), (yes) ? O_BINARY : O_TEXT) -@@ -228,11 +229,11 @@ char *pname; - { - fprintf(stderr, "Usage:\n %s [options] [infile [outfile]]\n", pname); - fprintf(stderr, " or\n %s -r [-s [-]offset] [-c cols] [-ps] [infile [outfile]]\n", pname); - fprintf(stderr, "Options:\n"); - fprintf(stderr, " -a toggle autoskip: A single '*' replaces nul-lines. Default off.\n"); -- fprintf(stderr, " -b binary digit dump (incompatible with -p,-i,-r). Default hex.\n"); -+ fprintf(stderr, " -b binary digit dump (incompatible with -ps,-i,-r). Default hex.\n"); - fprintf(stderr, " -c cols format <cols> octets per line. Default 16 (-i: 12, -ps: 30).\n"); - fprintf(stderr, " -E show characters in EBCDIC. Default ASCII.\n"); - fprintf(stderr, " -g number of octets per group in normal output. Default 2.\n"); - fprintf(stderr, " -h print this summary.\n"); - fprintf(stderr, " -i output in C include file style.\n"); -@@ -273,15 +274,15 @@ long base_off; - while ((c = getc(fpi)) != EOF) - { - if (c == '\r') /* Doze style input file? */ - continue; - --#if 0 /* this doesn't work when there is normal text after the hex codes in -- the last line that looks like hex */ -- if (c == ' ' || c == '\n' || c == '\t') /* allow multiple spaces */ -+ /* Allow multiple spaces. This doesn't work when there is normal text -+ * after the hex codes in the last line that looks like hex, thus only -+ * use it for PostScript format. */ -+ if (hextype == HEX_POSTSCRIPT && (c == ' ' || c == '\n' || c == '\t')) - continue; --#endif - - n3 = n2; - n2 = n1; - - if (c >= '0' && c <= '9') |