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 " has the same output as ":set " 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 =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 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 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 "" and "". + 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 "". + 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 "". + 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. can be used for the name of the file where this option was set, and 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|. + # 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 "# +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 or , 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 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 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 . 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 . 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(\"\")")))) - (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! 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 :call SetFirstLine() < 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 . 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 +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. Bruce Hunsaker --- 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 aeiouy/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 (empty cancels): ~ + +Type "2" and press 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("") !~ 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 -" 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 =~ '\' + 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 +" +" 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 #include #include /* 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 -# 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 #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 +#if STDC_HEADERS +# include +# include +#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 +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 +#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 +#if defined HAVE_SYS_PARAM_H +# include #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 /* for off_t */ + #include +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 /* for off_t */ + #include +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 +#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 #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 ." _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: %-. All but 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 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 doesn't define. */ #undef mode_t /* Define to `long' if 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 +#if STDC_HEADERS +# include +# include +#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 ], [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 ], [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 #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 +#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 @@ -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 @@ -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 +#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 ], [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 ],, 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 /* 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 #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 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, " ", transchar(c & 0x7f)); + vim_snprintf(buf2, sizeof(buf2), " ", + (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(). * resulting * ^? ^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}*/ + 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 + * :sign undefine */ + 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 ")); + 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 "); } - 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 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 " 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 ) */ -/*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 "" # 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 #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 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 \"\""); 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(\":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 /* - * works like CTRL-P (unless 'wc' is ). + * When there are matching completions to select works like + * CTRL-P (unless 'wc' is ). */ - 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 *)" ", 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 /* for SSIZE_MAX */ #endif #if defined(HAVE_UTIME) && defined(HAVE_UTIME_H) # include /* 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 . */ 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 "", special handling is needed which uses curbuf */ /* for pattern ", fnamecmp() will work fine */ - if (STRICMP(pattern, "") == 0) + if (pattern != NULL && STRICMP(pattern, "") == 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 through unchanged. Eg: * 'myfile' becomes '^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 ": 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(" ", fd) < 0) return FAIL; if (mp->m_silent && fputs(" ", 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 on cmdline */ +EXTERN int autocmd_fname_full; /* autocmd_fname is full path */ EXTERN int autocmd_bufnr INIT(= 0); /* fnum for on cmdline */ EXTERN char_u *autocmd_match INIT(= NULL); /* name for 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 CtrlM: 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., 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., + * 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 * "" 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 + 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 - 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 * - * 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 @@ - + + + + + true + + --- 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 ")); 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 * Original work by Brent Fulgham * (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 + /* 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(""); + MZ_GC_CHECK(); mz_window_type = scheme_make_type(""); + 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 # include #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 #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 +#ifdef RUBY19_OR_LATER +# include +#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 # include # endif -# if defined(HAVE_SYS_SELECT_H) && \ - (!defined(HAVE_SYS_TIME_H) || defined(SYS_SELECT_WITH_SYS_TIME)) -# include -# endif - -# ifndef HAVE_SELECT -# ifdef HAVE_SYS_POLL_H -# include -# else -# ifdef HAVE_POLL_H -# include -# 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 " 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 \tSend to a Vim server and exit")); main_msg(_("--remote-expr \tEvaluate in a Vim server and print result")); main_msg(_("--serverlist\t\tList available Vim server names and exit")); main_msg(_("--servername \tSend to/become the Vim server ")); #endif +#ifdef STARTUPTIME + main_msg(_("--startuptime \tWrite startup timing messages to ")); +#endif #ifdef FEAT_VIMINFO main_msg(_("-i \t\tUse 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 */ - 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 . */ + 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 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 was entered. */ if (mouse_used != NULL) - MSG_PUTS(_("Type number or click with mouse ( cancels): ")); + MSG_PUTS(_("Type number and or click with mouse (empty cancels): ")); else - MSG_PUTS(_("Choice number ( cancels): ")); + MSG_PUTS(_("Type number and (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 "". * 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 /* 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 + ) { /* * 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 # endif -# if defined(HAVE_SYS_SELECT_H) && \ - (!defined(HAVE_SYS_TIME_H) || defined(SYS_SELECT_WITH_SYS_TIME)) -# include -# 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 #endif -#ifndef HAVE_SELECT -# ifdef HAVE_SYS_POLL_H -# include -# else -# ifdef HAVE_POLL_H -# include -# endif -# endif -#endif - #ifdef HAVE_SYS_STREAM_H # include #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:
@@ -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 /* 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; } /*
: */ /* */ - 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); /* */ /* * :
... */ @@ -7953,22 +8141,22 @@ write_vim_spell(spin, fname) putc(SN_INFO, fd); /* */ putc(0, fd); /* */ i = (int)STRLEN(spin->si_info); put_bytes(fd, (long_u)i, 4); /* */ - fwrite(spin->si_info, (size_t)i, (size_t)1, fd); /* */ + fwv &= fwrite(spin->si_info, (size_t)i, (size_t)1, fd); /* */ } /* SN_REGION: ... * Write the region names only if there is more than one. */ if (spin->si_region_count > 1) { putc(SN_REGION, fd); /* */ putc(SNF_REQUIRED, fd); /* */ l = spin->si_region_count * 2; put_bytes(fd, (long_u)l, 4); /* */ - 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); /* ... */ 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); /* */ } put_bytes(fd, (long_u)l, 2); /* */ - fwrite(folchars, (size_t)l, (size_t)1, fd); /* */ + fwv &= fwrite(folchars, (size_t)l, (size_t)1, fd); /* */ } /* SN_MIDWORD: */ if (spin->si_midword != NULL) { putc(SN_MIDWORD, fd); /* */ putc(SNF_REQUIRED, fd); /* */ i = (int)STRLEN(spin->si_midword); put_bytes(fd, (long_u)i, 4); /* */ - fwrite(spin->si_midword, (size_t)i, (size_t)1, fd); /* */ + fwv &= fwrite(spin->si_midword, (size_t)i, (size_t)1, fd); + /* */ } /* SN_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); /* */ put_bytes(fd, (long_u)l, 2); /* */ - fwrite(spin->si_sofofr, l, (size_t)1, fd); /* */ + fwv &= fwrite(spin->si_sofofr, l, (size_t)1, fd); /* */ l = (int)STRLEN(spin->si_sofoto); put_bytes(fd, (long_u)l, 2); /* */ - fwrite(spin->si_sofoto, l, (size_t)1, fd); /* */ + fwv &= fwrite(spin->si_sofoto, l, (size_t)1, fd); /* */ } /* SN_WORDS: ... * 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) /* */ - 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); /* */ } @@ -8174,11 +8364,11 @@ write_vim_spell(spin, fname) { putc(SN_MAP, fd); /* */ putc(0, fd); /* */ l = spin->si_map.ga_len; put_bytes(fd, (long_u)l, 4); /* */ - 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); /* */ } /* SN_SUGFILE: * This is used to notify that a .sug file may be available and at the @@ -8230,14 +8420,15 @@ write_vim_spell(spin, fname) /* */ for (i = 0; i < spin->si_comppat.ga_len; ++i) { p = ((char_u **)(spin->si_comppat.ga_data))[i]; putc((int)STRLEN(p), fd); /* */ - fwrite(p, (size_t)STRLEN(p), (size_t)1, fd);/* */ + fwv &= fwrite(p, (size_t)STRLEN(p), (size_t)1, fd); + /* */ } /* */ - 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); /* */ putc(0, fd); /* */ l = (int)STRLEN(spin->si_syllable); put_bytes(fd, (long_u)l, 4); /* */ - fwrite(spin->si_syllable, (size_t)l, (size_t)1, fd); /* */ + fwv &= fwrite(spin->si_syllable, (size_t)l, (size_t)1, fd); + /* */ } /* end of */ putc(SN_END, fd); /* */ @@ -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); /* */ totlen = 2 + gap->ga_len; /* length of and 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 " 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 =xx" */ + { + /* from ":set =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 messge. + * 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, # Sandor Kopanyi, # -# 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 +zO j: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 :!echo buffer-local autommand in %>> test.out +:if has("vms") +: !del test.out.* +: au BufLeave :!write sys$output "buffer-local autommand in %" > test.out +:else +: !rm -f test.out +: au BufLeave :!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 :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#: " . exists("#BufEnter#")) +:au BufEnter let g:entered=1 +:call add(results, "#BufEnter#: " . exists("#BufEnter#")) +:edit testfile2.test +:call add(results, "#BufEnter#: " . exists("#BufEnter#")) +: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#: 0 +#BufEnter#: 1 +#BufEnter#: 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 Y +ENDTEST + +{ +X +Xa +X a +XY +X Y +} + +STARTTEST +/^{/+1 +:set tw=2 fo=tm +gqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqo +X +Xa +X a +XY +X Y +aX +abX +abcX +abX c +abXY +ENDTEST + +{ +X +Xa +X a +XY +X Y +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 +XaY +XY +XYZ +X Y +X YZ +XX +XXa +XXY +ENDTEST + +{ +X +Xa +XaY +XY +XYZ +X Y +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 +Y +X +Y + +X +X +a +X +a +X +Y +X +Y +} + + +{ +X +X +a +X +a +X +Y +X +Y +a +X +ab +X +abc +X +ab +X +c +ab +X +Y + +X +X +a +X +a +X +Y +X +Y +a +X +ab +X +abc +X +ab +X +c +ab +X +Y +} + + +{ + X + X + a + + X + X + a +} + + +{ + X + X +a + + X + X +a +} + + +{ +X +Xa +Xa +XY +XY +XY +XZ +X Y +X Y +X Z +XX +XXa +XXY + +X +Xa +Xa +XY +XY +XY +XZ +X Y +X Y +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 # 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 #endif +# if defined(HAVE_SYS_SELECT_H) && \ + (!defined(HAVE_SYS_TIME_H) || defined(SYS_SELECT_WITH_SYS_TIME)) +# include +# endif + +# ifndef HAVE_SELECT +# ifdef HAVE_SYS_POLL_H +# include +# define HAVE_POLL +# else +# ifdef HAVE_POLL_H +# include +# 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 : ""); #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 #ifdef VAXC # include #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 /* for setmode() */ #else # ifdef UNIX # include # 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 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')