diff options
author | Frans Meulenbroeks <fransmeulenbroeks@gmail.com> | 2010-08-15 09:28:10 +0200 |
---|---|---|
committer | Frans Meulenbroeks <fransmeulenbroeks@gmail.com> | 2010-08-15 09:28:10 +0200 |
commit | c2e3f410ad356fdec7ecd10754ecc5a7c63b46b7 (patch) | |
tree | c17589ffe61cea63409a5299342cad76352fb508 /recipes | |
parent | ebb96469a2809626c286dfb0ce2f9d61445dc6d9 (diff) |
vim: remved FILESDIR from inc; renamed patches dir
removed FILESDIR
moved vim-7.2 dir to files (which is afaik the preferred way if files are to be used by different
recipes (not being different versions of the recipe)
Signed-off-by: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
Diffstat (limited to 'recipes')
-rw-r--r-- | recipes/vim/files/001-411.diff | 51287 | ||||
-rw-r--r-- | recipes/vim/vim.inc | 4 |
2 files changed, 51288 insertions, 3 deletions
diff --git a/recipes/vim/files/001-411.diff b/recipes/vim/files/001-411.diff new file mode 100644 index 0000000000..420ac937d3 --- /dev/null +++ b/recipes/vim/files/001-411.diff @@ -0,0 +1,51287 @@ +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') diff --git a/recipes/vim/vim.inc b/recipes/vim/vim.inc index 185b599073..054d7d8d77 100644 --- a/recipes/vim/vim.inc +++ b/recipes/vim/vim.inc @@ -5,9 +5,7 @@ DEPENDS = "ncurses" RSUGGESTS_${PN} = "diffutils" LICENSE = "vim" -FILESDIR = "${@os.path.dirname(bb.data.getVar('FILE',d,1))}/vim-${PV}" - -INC_PR = "r5" +INC_PR = "r6" SRC_URI = "ftp://ftp.vim.org/pub/vim/unix/vim-${PV}.tar.bz2;name=vim${PV}tarbz2 \ ftp://ftp.vim.org/pub/vim/extra/vim-${PV}-extra.tar.gz;name=vim${PV}extratargz \ |