source:
patches/vim-7.2-branch_update-9.patch@
62069df
Last change on this file since 62069df was 54f612f, checked in by , 16 years ago | |
---|---|
|
|
File size: 218.8 KB |
-
Filelist
Submitted By: Jim Gifford (jim at cross-lfs dot org) Date: 02-22-2009 Initial Package Version: 7.2 Origin: Upstream Upstream Status: Applied Description: Contains all upstream patches up to 7.2.124 The following patches were skipped 007 036 041 049 071 072 074 088 089 093 101 diff -Naur vim72.orig/Filelist vim72/Filelist
old new 285 285 src/proto/os_win32.pro \ 286 286 src/proto/os_mswin.pro \ 287 287 src/testdir/Make_dos.mak \ 288 src/testdir/Make_ming.mak \ 288 289 src/testdir/dos.vim \ 289 290 src/uninstal.c \ 290 291 src/vim.def \ -
runtime/doc/cmdline.txt
diff -Naur vim72.orig/runtime/doc/cmdline.txt vim72/runtime/doc/cmdline.txt
old new 1 *cmdline.txt* For Vim version 7.2. Last change: 2008 Jul 291 *cmdline.txt* For Vim version 7.2. Last change: 2008 Sep 18 2 2 3 3 4 4 VIM REFERENCE MANUAL by Bram Moolenaar … … 157 157 (doesn't work at the expression prompt; some 158 158 things such as changing the buffer or current 159 159 window are not allowed to avoid side effects) 160 When the result is a |List| the items are used 161 as lines. They can have line breaks inside 162 too. 163 When the result is a Float it's automatically 164 converted to a String. 160 165 See |registers| about registers. {not in Vi} 161 166 Implementation detail: When using the |expression| register 162 167 and invoking setcmdpos(), this sets the position before … … 730 735 In Ex commands, at places where a file name can be used, the following 731 736 characters have a special meaning. These can also be used in the expression 732 737 function expand() |expand()|. 733 % is replaced with the current file name *:_%*734 # is replaced with the alternate file name *:_#*738 % Is replaced with the current file name. *:_%* *c_%* 739 # Is replaced with the alternate file name. *:_#* *c_#* 735 740 #n (where n is a number) is replaced with the file name of 736 buffer n. "#0" is the same as "#" 737 ## is replaced with all names in the argument list *:_##*741 buffer n. "#0" is the same as "#". 742 ## Is replaced with all names in the argument list *:_##* *c_##* 738 743 concatenated, separated by spaces. Each space in a name 739 744 is preceded with a backslash. 740 Note that these give the file name as it was typed. If an absolute path is 741 needed (when using the file name from a different directory), you need to add 742 ":p". See |filename-modifiers|. 745 #<n (where n is a number > 0) is replaced with old *:_#<* *c_#<* 746 file name n. See |:oldfiles| or |v:oldfiles| to get the 747 number. *E809* 748 {only when compiled with the +eval and +viminfo features} 749 750 Note that these, except "#<n", give the file name as it was typed. If an 751 absolute path is needed (when using the file name from a different directory), 752 you need to add ":p". See |filename-modifiers|. 753 754 The "#<n" item returns an absolute path, but it will start with "~/" for files 755 below your home directory. 756 743 757 Note that backslashes are inserted before spaces, so that the command will 744 758 correctly interpret the file name. But this doesn't happen for shell 745 commands. For those you probably have to use quotes: > 759 commands. For those you probably have to use quotes (this fails for files 760 that contain a quote and wildcards): > 746 761 :!ls "%" 747 762 :r !spell "%" 748 763 -
runtime/doc/eval.txt
diff -Naur vim72.orig/runtime/doc/eval.txt vim72/runtime/doc/eval.txt
old new 1 *eval.txt* For Vim version 7.2. Last change: 2008 Aug 091 *eval.txt* For Vim version 7.2. Last change: 2008 Nov 27 2 2 3 3 4 4 VIM REFERENCE MANUAL by Bram Moolenaar … … 1484 1484 This is the screen column number, like with |virtcol()|. The 1485 1485 value is zero when there was no mouse button click. 1486 1486 1487 *v:oldfiles* *oldfiles-variable* 1488 v:oldfiles List of file names that is loaded from the |viminfo| file on 1489 startup. These are the files that Vim remembers marks for. 1490 The length of the List is limited by the ' argument of the 1491 'viminfo' option (default is 100). 1492 Also see |:oldfiles| and |c_#<|. 1493 The List can be modified, but this has no effect on what is 1494 stored in the |viminfo| file later. If you use values other 1495 than String this will cause trouble. 1496 {only when compiled with the +viminfo feature} 1497 1487 1498 *v:operator* *operator-variable* 1488 1499 v:operator The last operator given in Normal mode. This is a single 1489 1500 character except for commands starting with <g> or <z>, … … 1695 1706 exists( {expr}) Number TRUE if {expr} exists 1696 1707 extend({expr1}, {expr2} [, {expr3}]) 1697 1708 List/Dict insert items of {expr2} into {expr1} 1698 expand( {expr} )String expand special keywords in {expr}1709 expand( {expr} [, {flag}]) String expand special keywords in {expr} 1699 1710 feedkeys( {string} [, {mode}]) Number add key sequence to typeahead buffer 1700 1711 filereadable( {file}) Number TRUE if {file} is a readable file 1701 1712 filewritable( {file}) Number TRUE if {file} is a writable file … … 1747 1758 getwinposx() Number X coord in pixels of GUI Vim window 1748 1759 getwinposy() Number Y coord in pixels of GUI Vim window 1749 1760 getwinvar( {nr}, {varname}) any variable {varname} in window {nr} 1750 glob( {expr}) String expand file wildcards in {expr} 1751 globpath( {path}, {expr}) String do glob({expr}) for all dirs in {path} 1761 glob( {expr} [, {flag}]) String expand file wildcards in {expr} 1762 globpath( {path}, {expr} [, {flag}]) 1763 String do glob({expr}) for all dirs in {path} 1752 1764 has( {feature}) Number TRUE if feature {feature} supported 1753 1765 has_key( {dict}, {key}) Number TRUE if {dict} has entry {key} 1754 1766 haslocaldir() Number TRUE if current window executed |:lcd| … … 3275 3287 :let list_is_on = getwinvar(2, '&list') 3276 3288 :echo "myvar = " . getwinvar(1, 'myvar') 3277 3289 < 3278 3279 glob({expr})Expand the file wildcards in {expr}. See |wildcards| for the3290 glob({expr} [, {flag}]) *glob()* 3291 Expand the file wildcards in {expr}. See |wildcards| for the 3280 3292 use of special characters. 3281 3293 The result is a String. 3282 3294 When there are several matches, they are separated by <NL> 3283 3295 characters. 3284 The 'wildignore' option applies: Names matching one of the 3285 patterns in 'wildignore' will be skipped. 3296 Unless the optional {flag} argument is given and is non-zero, 3297 the 'suffixes' and 'wildignore' options apply: Names matching 3298 one of the patterns in 'wildignore' will be skipped and 3299 'suffixes' affect the ordering of matches. 3286 3300 If the expansion fails, the result is an empty string. 3287 3301 A name for a non-existing file is not included. 3288 3302 … … 3296 3310 See |expand()| for expanding special Vim variables. See 3297 3311 |system()| for getting the raw output of an external command. 3298 3312 3299 globpath({path}, {expr} )*globpath()*3313 globpath({path}, {expr} [, {flag}]) *globpath()* 3300 3314 Perform glob() on all directories in {path} and concatenate 3301 3315 the results. Example: > 3302 3316 :echo globpath(&rtp, "syntax/c.vim") 3303 3317 < {path} is a comma-separated list of directory names. Each 3304 3318 directory name is prepended to {expr} and expanded like with 3305 glob(). A path separator is inserted when needed.3319 |glob()|. A path separator is inserted when needed. 3306 3320 To add a comma inside a directory name escape it with a 3307 3321 backslash. Note that on MS-Windows a directory may have a 3308 3322 trailing backslash, remove it if you put a comma after it. 3309 3323 If the expansion fails for one of the directories, there is no 3310 3324 error message. 3311 The 'wildignore' option applies: Names matching one of the 3312 patterns in 'wildignore' will be skipped. 3325 Unless the optional {flag} argument is given and is non-zero, 3326 the 'suffixes' and 'wildignore' options apply: Names matching 3327 one of the patterns in 'wildignore' will be skipped and 3328 'suffixes' affect the ordering of matches. 3313 3329 3314 3330 The "**" item can be used to search in a directory tree. 3315 3331 For example, to find all "README.txt" files in the directories … … 5332 5348 "fg" foreground color (GUI: color name used to set 5333 5349 the color, cterm: color number as a string, 5334 5350 term: empty string) 5335 "bg" background color (like "fg") 5351 "bg" background color (as with "fg") 5352 "sp" special color (as with "fg") |highlight-guisp| 5336 5353 "fg#" like "fg", but for the GUI and the GUI is 5337 5354 running the name in "#RRGGBB" form 5338 5355 "bg#" like "fg#" for "bg" 5356 "sp#" like "fg#" for "sp" 5339 5357 "bold" "1" if bold 5340 5358 "italic" "1" if italic 5341 5359 "reverse" "1" if reverse … … 5823 5841 mouse_pterm Compiled with support for qnx pterm mouse. 5824 5842 mouse_sysmouse Compiled with support for sysmouse (*BSD console mouse) 5825 5843 mouse_xterm Compiled with support for xterm mouse. 5826 multi_byte Compiled with support for editing Korean et al. 5844 multi_byte Compiled with support for 'encoding' 5845 multi_byte_encoding 'encoding' is set to a multi-byte encoding. 5827 5846 multi_byte_ime Compiled with support for IME input method. 5828 5847 multi_lang Compiled with support for multiple languages. 5829 5848 mzscheme Compiled with MzScheme interface |mzscheme|. -
runtime/doc/netbeans.txt
diff -Naur vim72.orig/runtime/doc/netbeans.txt vim72/runtime/doc/netbeans.txt
old new 1 *netbeans.txt* For Vim version 7.2. Last change: 200 8 Jun 281 *netbeans.txt* For Vim version 7.2. Last change: 2009 Jan 06 2 2 3 3 4 4 VIM REFERENCE MANUAL by Gordon Prieur et al. … … 722 722 of the cursor. 723 723 New in version 2.1. 724 724 725 killed A file was closed by the user. Only for files that have been 726 assigned a number by the IDE. 725 killed A file was deleted or wiped out by the user and the buffer 726 annotations have been removed. The bufID number for this 727 buffer has become invalid. Only for files that have been 728 assigned a bufID number by the IDE. 727 729 728 730 newDotAndMark off off 729 731 Reports the position of the cursor being at "off" bytes into -
runtime/doc/options.txt
diff -Naur vim72.orig/runtime/doc/options.txt vim72/runtime/doc/options.txt
old new 1 *options.txt* For Vim version 7.2. Last change: 2008 Aug 061 *options.txt* For Vim version 7.2. Last change: 2008 Nov 25 2 2 3 3 4 4 VIM REFERENCE MANUAL by Bram Moolenaar … … 4175 4175 be able to execute Normal mode commands. 4176 4176 This is the opposite of the 'keymap' option, where characters are 4177 4177 mapped in Insert mode. 4178 This only works for 8-bit characters. The value of 'langmap' may be4179 specified with multi-byte characters (e.g., UTF-8), but only the lower4180 8 bits of each character will be used.4181 4178 4182 4179 Example (for Greek, in UTF-8): *greek* > 4183 4180 :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,Ï -
runtime/doc/spell.txt
y,ζz @@ -7472,7 +7469,9 @@ {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: > diff -Naur vim72.orig/runtime/doc/spell.txt vim72/runtime/doc/spell.txt
old new 1 *spell.txt* For Vim version 7.2. Last change: 2008 Jun 211 *spell.txt* For Vim version 7.2. Last change: 2008 Nov 30 2 2 3 3 4 4 VIM REFERENCE MANUAL by Bram Moolenaar … … 831 831 832 832 # comment line ~ 833 833 834 With some items it's also possible to put a comment after it, but this isn't 835 supported in general. 834 Items with a fixed number of arguments can be followed by a comment. But only 835 if none of the arguments can contain white space. The comment must start with 836 a "#" character. Example: 837 838 KEEPCASE = # fix case for words with this flag ~ 836 839 837 840 838 841 ENCODING *spell-SET* … … 965 968 966 969 Note: When using utf-8 only characters up to 65000 may be used for flags. 967 970 971 Note: even when using "num" or "long" the number of flags available to 972 compounding and prefixes is limited to about 250. 973 968 974 969 975 AFFIXES 970 976 *spell-PFX* *spell-SFX* … … 1178 1184 The flag also applies to the word with affixes, thus this can be used to mark 1179 1185 a whole bunch of related words as bad. 1180 1186 1187 *spell-FORBIDDENWORD* 1188 FORBIDDENWORD can be used just like BAD. For compatibility with Hunspell. 1189 1181 1190 *spell-NEEDAFFIX* 1182 1191 The NEEDAFFIX flag is used to require that a word is used with an affix. The 1183 1192 word itself is not a good word (unless there is an empty affix). Example: … … 1268 1277 1269 1278 NEEDCOMPOUND & ~ 1270 1279 1280 *spell-ONLYINCOMPOUND* 1281 The ONLYINCOMPOUND does exactly the same as NEEDCOMPOUND. Supported for 1282 compatiblity with Hunspell. 1283 1271 1284 *spell-COMPOUNDMIN* 1272 1285 The minimal character length of a word used for compounding is specified with 1273 1286 COMPOUNDMIN. Example: … … 1328 1341 rules. Can also be used for an affix to count the affix as a compounding 1329 1342 word. 1330 1343 1344 *spell-CHECKCOMPOUNDPATTERN* 1345 CHECKCOMPOUNDPATTERN is used to define patterns that, when matching at the 1346 position where two words are compounded together forbids the compound. 1347 For example: 1348 CHECKCOMPOUNDPATTERN o e ~ 1349 1350 This forbids compounding if the first word ends in "o" and the second word 1351 starts with "e". 1352 1353 The arguments must be plain text, no patterns are actually supported, despite 1354 the item name. Case is always ignored. 1355 1356 The Hunspell feature to use three arguments and flags is not supported. 1357 1331 1358 *spell-SYLLABLE* 1332 1359 The SYLLABLE item defines characters or character sequences that are used to 1333 1360 count the number of syllables in a word. Example: … … 1496 1523 ACCENT (Hunspell) *spell-ACCENT* 1497 1524 Use MAP instead. |spell-MAP| 1498 1525 1526 BREAK (Hunspell) *spell-BREAK* 1527 Define break points. Unclear how it works exactly. 1528 Not supported. 1529 1499 1530 CHECKCOMPOUNDCASE (Hunspell) *spell-CHECKCOMPOUNDCASE* 1500 1531 Disallow uppercase letters at compound word boundaries. 1501 1532 Not supported. … … 1512 1543 Forbid three identical characters when compounding. Not 1513 1544 supported. 1514 1545 1515 CHECKCOMPOUNDPATTERN (Hunspell) *spell-CHECKCOMPOUNDPATTERN*1516 Forbid compounding when patterns match. Not supported.1517 1518 1546 COMPLEXPREFIXES (Hunspell) *spell-COMPLEXPREFIXES* 1519 1547 Enables using two prefixes. Not supported. 1520 1548 … … 1536 1564 COMPOUNDMIDDLE (Hunspell) *spell-COMPOUNDMIDDLE* 1537 1565 Use COMPOUNDRULE instead. |spell-COMPOUNDRULE| 1538 1566 1567 COMPOUNDRULES (Hunspell) *spell-COMPOUNDRULES* 1568 Number of COMPOUNDRULE lines following. Ignored, but the 1569 argument must be a number. 1570 1539 1571 COMPOUNDSYLLABLE (Hunspell) *spell-COMPOUNDSYLLABLE* 1540 1572 Use SYLLABLE and COMPOUNDSYLMAX instead. |spell-SYLLABLE| 1541 1573 |spell-COMPOUNDSYLMAX| 1542 1574 1543 FORBIDDENWORD (Hunspell) *spell-FORBIDDENWORD* 1544 Use BAD instead. |spell-BAD| 1545 1575 KEY (Hunspell) *spell-KEY* 1576 Define characters that are close together on the keyboard. 1577 Used to give better suggestions. Not supported. 1578 1546 1579 LANG (Hunspell) *spell-LANG* 1547 1580 This specifies language-specific behavior. This actually 1548 1581 moves part of the language knowledge into the program, … … 1553 1586 Only needed for morphological analysis. 1554 1587 1555 1588 MAXNGRAMSUGS (Hunspell) *spell-MAXNGRAMSUGS* 1556 Not supported. 1557 1558 ONLYINCOMPOUND (Hunspell) *spell-ONLYINCOMPOUND* 1559 Use NEEDCOMPOUND instead. |spell-NEEDCOMPOUND| 1589 Set number of n-gram suggestions. Not supported. 1560 1590 1561 1591 PSEUDOROOT (Hunspell) *spell-PSEUDOROOT* 1562 1592 Use NEEDAFFIX instead. |spell-NEEDAFFIX| -
runtime/doc/starting.txt
diff -Naur vim72.orig/runtime/doc/starting.txt vim72/runtime/doc/starting.txt
old new 1 *starting.txt* For Vim version 7.2. Last change: 2008 Jun 211 *starting.txt* For Vim version 7.2. Last change: 2008 Nov 09 2 2 3 3 4 4 VIM REFERENCE MANUAL by Bram Moolenaar … … 1337 1337 *viminfo-read* 1338 1338 When Vim is started and the 'viminfo' option is non-empty, the contents of 1339 1339 the viminfo file are read and the info can be used in the appropriate places. 1340 The marks are not read in at startup (but file marks are). See 1341 |initialization| for how to set the 'viminfo' option upon startup. 1340 The |v:oldfiles| variable is filled. The marks are not read in at startup 1341 (but file marks are). See |initialization| for how to set the 'viminfo' 1342 option upon startup. 1342 1343 1343 1344 *viminfo-write* 1344 1345 When Vim exits and 'viminfo' is non-empty, the info is stored in the viminfo … … 1372 1373 that start with any string given with the "r" flag in 'viminfo'. This can be 1373 1374 used to avoid saving marks for files on removable media (for MS-DOS you would 1374 1375 use "ra:,rb:", for Amiga "rdf0:,rdf1:,rdf2:"). 1376 The |v:oldfiles| variable is filled with the file names that the viminfo file 1377 has marks for. 1375 1378 1376 1379 *viminfo-file-marks* 1377 1380 Uppercase marks ('A to 'Z) are stored when writing the viminfo file. The … … 1463 1466 *:rv* *:rviminfo* *E195* 1464 1467 :rv[iminfo][!] [file] Read from viminfo file [file] (default: see above). 1465 1468 If [!] is given, then any information that is 1466 already set (registers, marks, etc.) will be1467 overwritten.{not in Vi}1469 already set (registers, marks, |v:oldfiles|, etc.) 1470 will be overwritten {not in Vi} 1468 1471 1469 1472 *:wv* *:wviminfo* *E137* *E138* *E574* 1470 1473 :wv[iminfo][!] [file] Write to viminfo file [file] (default: see above). … … 1479 1482 the .viminfo file. 1480 1483 {not in Vi} 1481 1484 1485 *:ol* *:oldfiles* 1486 :ol[dfiles] List the files that have marks stored in the viminfo 1487 file. This list is read on startup and only changes 1488 afterwards with ":rviminfo!". Also see |v:oldfiles|. 1489 The number can be used with |c_#<|. 1490 {not in Vi, only when compiled with the +eval feature} 1491 1492 :bro[wse] ol[dfiles][!] 1493 List file names as with |:oldfiles|, and then prompt 1494 for a number. When the number is valid that file from 1495 the list is edited. 1496 If you get the |press-enter| prompt you can press "q" 1497 and still get the prompt to enter a file number. 1498 Use ! to abondon a modified buffer. |abandon| 1499 {not when compiled with tiny or small features} 1500 1482 1501 vim:tw=78:ts=8:ft=help:norl: -
runtime/doc/usr_21.txt
diff -Naur vim72.orig/runtime/doc/usr_21.txt vim72/runtime/doc/usr_21.txt
old new 1 *usr_21.txt* For Vim version 7.2. Last change: 200 7 May 011 *usr_21.txt* For Vim version 7.2. Last change: 2008 Nov 09 2 2 3 3 VIM USER MANUAL - by Bram Moolenaar 4 4 … … 153 153 to be lost. Each item can be remembered only once. 154 154 155 155 156 GETTING BACK TO WHERE YOU WERE156 GETTING BACK TO WHERE YOU STOPPED VIM 157 157 158 158 You are halfway editing a file and it's time to leave for holidays. You exit 159 159 Vim and go enjoy yourselves, forgetting all about your work. After a couple … … 168 168 The |:marks| command is useful to find out where '0 to '9 will take you. 169 169 170 170 171 GETTING BACK TO SOME FILE 172 173 If you want to go back to a file that you edited recently, but not when 174 exiting Vim, there is a slightly more complicated way. You can see a list of 175 files by typing the command: > 176 177 :oldfiles 178 < 1: ~/.viminfo ~ 179 2: ~/text/resume.txt ~ 180 3: /tmp/draft ~ 181 182 Now you would like to edit the second file, which is in the list preceded by 183 "2:". You type: > 184 185 :e #<2 186 187 Instead of ":e" you can use any command that has a file name argument, the 188 "#<2" item works in the same place as "%" (current file name) and "#" 189 (alternate file name). So you can also split the window to edit the third 190 file: > 191 192 :split #<3 193 194 That #<123 thing is a bit complicated when you just want to edit a file. 195 Fortunately there is a simpler way: > 196 197 :browse oldfiles 198 < 1: ~/.viminfo ~ 199 2: ~/text/resume.txt ~ 200 3: /tmp/draft ~ 201 -- More -- 202 203 You get the same list of files as with |:oldfiles|. If you want to edit 204 "resume.txt" first press "q" to stop the listing. You will get a prompt: 205 206 Type number and <Enter> (empty cancels): ~ 207 208 Type "2" and press <Enter> to edit the second file. 209 210 More info at |:oldfiles|, |v:oldfiles| and |c_#<|. 211 212 171 213 MOVE INFO FROM ONE VIM TO ANOTHER 172 214 173 215 You can use the ":wviminfo" and ":rviminfo" commands to save and restore the -
runtime/scripts.vim
diff -Naur vim72.orig/runtime/scripts.vim vim72/runtime/scripts.vim
old new 234 234 elseif s:line1 =~ '\<DTD\s\+XHTML\s' 235 235 set ft=xhtml 236 236 237 " HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN") 238 elseif s:line1 =~? '\<DOCTYPE\s\+html\>' 239 set ft=html 240 237 241 " PDF 238 242 elseif s:line1 =~ '^%PDF-' 239 243 set ft=pdf -
src/auto/configure
diff -Naur vim72.orig/src/auto/configure vim72/src/auto/configure
old new 16819 16819 LDFLAGS="$LDFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" 16820 16820 fi 16821 16821 16822 { $as_echo "$as_me:$LINENO: checking for GCC 3 or later" >&516823 $as_echo_n "checking for GCC 3 or later... " >&6; }16824 16822 DEPEND_CFLAGS_FILTER= 16825 16823 if test "$GCC" = yes; then 16824 { $as_echo "$as_me:$LINENO: checking for GCC 3 or later" >&5 16825 $as_echo_n "checking for GCC 3 or later... " >&6; } 16826 16826 gccmajor=`echo "$gccversion" | sed -e 's/^\([1-9]\)\..*$/\1/g'` 16827 16827 if test "$gccmajor" -gt "2"; then 16828 16828 DEPEND_CFLAGS_FILTER="| sed 's+-I */+-isystem /+g'" 16829 fi16830 fi 16831 if test "$DEPEND_CFLAGS_FILTER" = ""; then 16832 { $as_echo "$as_me:$LINENO: result: no" >&516829 { $as_echo "$as_me:$LINENO: result: yes" >&5 16830 $as_echo "yes" >&6; } 16831 else 16832 { $as_echo "$as_me:$LINENO: result: no" >&5 16833 16833 $as_echo "no" >&6; } 16834 else 16835 { $as_echo "$as_me:$LINENO: result: yes" >&5 16834 fi 16835 { $as_echo "$as_me:$LINENO: checking whether we need -D_FORTIFY_SOURCE=1" >&5 16836 $as_echo_n "checking whether we need -D_FORTIFY_SOURCE=1... " >&6; } 16837 if test "$gccmajor" -gt "3"; then 16838 CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=1" 16839 { $as_echo "$as_me:$LINENO: result: yes" >&5 16836 16840 $as_echo "yes" >&6; } 16841 else 16842 { $as_echo "$as_me:$LINENO: result: no" >&5 16843 $as_echo "no" >&6; } 16844 fi 16837 16845 fi 16838 16846 16839 16847 -
src/buffer.c
diff -Naur vim72.orig/src/buffer.c vim72/src/buffer.c
old new 437 437 return; 438 438 #endif 439 439 440 #ifdef FEAT_NETBEANS_INTG441 if (usingNetbeans)442 netbeans_file_closed(buf);443 #endif444 440 /* Change directories when the 'acd' option is set. */ 445 441 DO_AUTOCHDIR 446 442 … … 639 635 #ifdef FEAT_SIGNS 640 636 buf_delete_signs(buf); /* delete any signs */ 641 637 #endif 638 #ifdef FEAT_NETBEANS_INTG 639 if (usingNetbeans) 640 netbeans_file_killed(buf); 641 #endif 642 642 #ifdef FEAT_LOCALMAP 643 643 map_clear_int(buf, MAP_ALL_MODES, TRUE, FALSE); /* clear local mappings */ 644 644 map_clear_int(buf, MAP_ALL_MODES, TRUE, TRUE); /* clear local abbrevs */ … … 647 647 vim_free(buf->b_start_fenc); 648 648 buf->b_start_fenc = NULL; 649 649 #endif 650 #ifdef FEAT_SPELL 651 ga_clear(&buf->b_langp); 652 #endif 650 653 } 651 654 652 655 /* … … 812 815 int bnr; /* buffer number */ 813 816 char_u *p; 814 817 815 #ifdef FEAT_NETBEANS_INTG816 netbeansCloseFile = 1;817 #endif818 818 if (addr_count == 0) 819 819 { 820 820 (void)do_buffer(command, DOBUF_CURRENT, FORWARD, 0, forceit); … … 909 909 } 910 910 } 911 911 912 #ifdef FEAT_NETBEANS_INTG913 netbeansCloseFile = 0;914 #endif915 912 916 913 return errormsg; 917 914 } … … 1237 1234 * "buf" if one exists */ 1238 1235 if ((swb_flags & SWB_USEOPEN) && buf_jump_open_win(buf)) 1239 1236 return OK; 1240 /* If 'switchbuf' cont ians "usetab": jump to first window in any tab1237 /* If 'switchbuf' contains "usetab": jump to first window in any tab 1241 1238 * page containing "buf" if one exists */ 1242 1239 if ((swb_flags & SWB_USETAB) && buf_jump_open_tab(buf)) 1243 1240 return OK; … … 1351 1348 } 1352 1349 } 1353 1350 #ifdef FEAT_AUTOCMD 1351 /* An autocommand may have deleted "buf", already entered it (e.g., when 1352 * it did ":bunload") or aborted the script processing! */ 1354 1353 # ifdef FEAT_EVAL 1355 /* An autocommand may have deleted buf or aborted the script processing! */ 1356 if (buf_valid(buf) && !aborting()) 1354 if (buf_valid(buf) && buf != curbuf && !aborting()) 1357 1355 # else 1358 if (buf_valid(buf) ) /* an autocommand may have deleted buf! */1356 if (buf_valid(buf) && buf != curbuf) 1359 1357 # endif 1360 1358 #endif 1361 1359 enter_buffer(buf); … … 1397 1395 curwin->w_cursor.coladd = 0; 1398 1396 #endif 1399 1397 curwin->w_set_curswant = TRUE; 1398 #ifdef FEAT_AUTOCMD 1399 curwin->w_topline_was_set = FALSE; 1400 #endif 1400 1401 1401 1402 /* Make sure the buffer is loaded. */ 1402 1403 if (curbuf->b_ml.ml_mfp == NULL) /* need to load the file */ … … 1436 1437 maketitle(); 1437 1438 #endif 1438 1439 #ifdef FEAT_AUTOCMD 1439 if (curwin->w_topline == 1) /* when autocmds didn't change it */ 1440 /* when autocmds didn't change it */ 1441 if (curwin->w_topline == 1 && !curwin->w_topline_was_set) 1440 1442 #endif 1441 1443 scroll_cursor_halfway(FALSE); /* redisplay at correct position */ 1442 1444 … … 3963 3965 width = vim_strsize(out); 3964 3966 if (maxwidth > 0 && width > maxwidth) 3965 3967 { 3966 /* Result is too long, must trunc tate somewhere. */3968 /* Result is too long, must truncate somewhere. */ 3967 3969 l = 0; 3968 3970 if (itemcnt == 0) 3969 3971 s = out; … … 5048 5050 */ 5049 5051 FOR_ALL_TAB_WINDOWS(tp, win) 5050 5052 if (win->w_buffer == buf) 5051 break; 5053 goto win_found; 5054 win_found: 5052 5055 if (win != NULL && win->w_llist_ref != NULL) 5053 5056 return _("[Location List]"); 5054 5057 else … … 5062 5065 { 5063 5066 if (buf->b_sfname != NULL) 5064 5067 return (char *)buf->b_sfname; 5065 return "[Scratch]";5068 return _("[Scratch]"); 5066 5069 } 5067 5070 #endif 5068 5071 if (buf->b_fname == NULL) -
src/configure.in
diff -Naur vim72.orig/src/configure.in vim72/src/configure.in
old new 3152 3152 dnl But only when making dependencies, cproto and lint don't take "-isystem". 3153 3153 dnl Mac gcc returns "powerpc-apple-darwin8-gcc-4.0.1 (GCC)...", need to allow 3154 3154 dnl the number before the version number. 3155 AC_MSG_CHECKING(for GCC 3 or later)3156 3155 DEPEND_CFLAGS_FILTER= 3157 3156 if test "$GCC" = yes; then 3157 AC_MSG_CHECKING(for GCC 3 or later) 3158 3158 gccmajor=`echo "$gccversion" | sed -e 's/^\([[1-9]]\)\..*$/\1/g'` 3159 3159 if test "$gccmajor" -gt "2"; then 3160 3160 DEPEND_CFLAGS_FILTER="| sed 's+-I */+-isystem /+g'" 3161 AC_MSG_RESULT(yes) 3162 else 3163 AC_MSG_RESULT(no) 3164 fi 3165 dnl -D_FORTIFY_SOURCE=2 crashes Vim on strcpy(buf, "000") when buf is 3166 dnl declared as char x[1] but actually longer. Introduced in gcc 4.0. 3167 AC_MSG_CHECKING(whether we need -D_FORTIFY_SOURCE=1) 3168 if test "$gccmajor" -gt "3"; then 3169 CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=1" 3170 AC_MSG_RESULT(yes) 3171 else 3172 AC_MSG_RESULT(no) 3161 3173 fi 3162 fi3163 if test "$DEPEND_CFLAGS_FILTER" = ""; then3164 AC_MSG_RESULT(no)3165 else3166 AC_MSG_RESULT(yes)3167 3174 fi 3168 3175 AC_SUBST(DEPEND_CFLAGS_FILTER) 3169 3176 -
src/diff.c
diff -Naur vim72.orig/src/diff.c vim72/src/diff.c
old new 8 8 */ 9 9 10 10 /* 11 * diff.c: code for diff'ing two or threebuffers.11 * diff.c: code for diff'ing two, three or four buffers. 12 12 */ 13 13 14 14 #include "vim.h" … … 73 73 { 74 74 tp->tp_diffbuf[i] = NULL; 75 75 tp->tp_diff_invalid = TRUE; 76 if (tp == curtab) 77 diff_redraw(TRUE); 76 78 } 77 79 } 78 80 } … … 102 104 { 103 105 curtab->tp_diffbuf[i] = NULL; 104 106 curtab->tp_diff_invalid = TRUE; 107 diff_redraw(TRUE); 105 108 } 106 109 } 107 110 } … … 113 116 * Add a buffer to make diffs for. 114 117 * Call this when a new buffer is being edited in the current window where 115 118 * 'diff' is set. 116 * Marks the current buffer as being part of the diff and requir eing updating.119 * Marks the current buffer as being part of the diff and requiring updating. 117 120 * This must be done before any autocmd, because a command may use info 118 121 * about the screen contents. 119 122 */ … … 131 134 { 132 135 curtab->tp_diffbuf[i] = buf; 133 136 curtab->tp_diff_invalid = TRUE; 137 diff_redraw(TRUE); 134 138 return; 135 139 } 136 140 … … 661 665 char_u *tmp_diff; 662 666 FILE *fd; 663 667 int ok; 668 int io_error = FALSE; 664 669 665 670 /* Delete all diffblocks. */ 666 671 diff_clear(curtab); … … 697 702 { 698 703 ok = FALSE; 699 704 fd = mch_fopen((char *)tmp_orig, "w"); 700 if (fd != NULL) 705 if (fd == NULL) 706 io_error = TRUE; 707 else 701 708 { 702 fwrite("line1\n", (size_t)6, (size_t)1, fd); 709 if (fwrite("line1\n", (size_t)6, (size_t)1, fd) != 1) 710 io_error = TRUE; 703 711 fclose(fd); 704 712 fd = mch_fopen((char *)tmp_new, "w"); 705 if (fd != NULL) 713 if (fd == NULL) 714 io_error = TRUE; 715 else 706 716 { 707 fwrite("line2\n", (size_t)6, (size_t)1, fd); 717 if (fwrite("line2\n", (size_t)6, (size_t)1, fd) != 1) 718 io_error = TRUE; 708 719 fclose(fd); 709 720 diff_file(tmp_orig, tmp_new, tmp_diff); 710 721 fd = mch_fopen((char *)tmp_diff, "r"); 711 if (fd != NULL) 722 if (fd == NULL) 723 io_error = TRUE; 724 else 712 725 { 713 726 char_u linebuf[LBUFLEN]; 714 727 … … 761 774 } 762 775 if (!ok) 763 776 { 777 if (io_error) 778 EMSG(_("E810: Cannot read or write temp files")); 764 779 EMSG(_("E97: Cannot create diffs")); 765 780 diff_a_works = MAYBE; 766 781 #if defined(MSWIN) || defined(MSDOS) … … 914 929 goto theend; 915 930 916 931 #ifdef UNIX 917 /* Temporar aly chdir to /tmp, to avoid patching files in the current932 /* Temporarily chdir to /tmp, to avoid patching files in the current 918 933 * directory when the patch file contains more than one patch. When we 919 934 * have our own temp dir use that instead, it will be cleaned up when we 920 935 * exit (any .rej files created). Don't change directory if we can't … … 925 940 { 926 941 # ifdef TEMPDIRNAMES 927 942 if (vim_tempdir != NULL) 928 mch_chdir((char *)vim_tempdir);943 ignored = mch_chdir((char *)vim_tempdir); 929 944 else 930 945 # endif 931 mch_chdir("/tmp");946 ignored = mch_chdir("/tmp"); 932 947 shorten_fnames(TRUE); 933 948 } 934 949 #endif … … 2114 2129 EMSG2(_("E102: Can't find buffer \"%s\""), eap->arg); 2115 2130 return; 2116 2131 } 2132 if (buf == curbuf) 2133 return; /* nothing to do */ 2117 2134 idx_other = diff_buf_idx(buf); 2118 2135 if (idx_other == DB_COUNT) 2119 2136 { -
src/edit.c
diff -Naur vim72.orig/src/edit.c vim72/src/edit.c
old new 147 147 static int ins_compl_bs __ARGS((void)); 148 148 static void ins_compl_new_leader __ARGS((void)); 149 149 static void ins_compl_addleader __ARGS((int c)); 150 static int ins_compl_len __ARGS((void)); 150 151 static void ins_compl_restart __ARGS((void)); 151 152 static void ins_compl_set_original_text __ARGS((char_u *str)); 152 153 static void ins_compl_addfrommatch __ARGS((void)); … … 197 198 static void mb_replace_pop_ins __ARGS((int cc)); 198 199 #endif 199 200 static void replace_flush __ARGS((void)); 200 static void replace_do_bs __ARGS((void)); 201 static void replace_do_bs __ARGS((int limit_col)); 202 static int del_char_after_col __ARGS((int limit_col)); 201 203 #ifdef FEAT_CINDENT 202 204 static int cindent_on __ARGS((void)); 203 205 #endif … … 1933 1935 /* 1934 1936 * Backspace the cursor until the given column. Handles REPLACE and VREPLACE 1935 1937 * modes correctly. May also be used when not in insert mode at all. 1938 * Will attempt not to go before "col" even when there is a composing 1939 * character. 1936 1940 */ 1937 1941 void 1938 1942 backspace_until_column(col) … … 1942 1946 { 1943 1947 curwin->w_cursor.col--; 1944 1948 if (State & REPLACE_FLAG) 1945 replace_do_bs( );1946 else 1947 (void)del_char(FALSE);1949 replace_do_bs(col); 1950 else if (!del_char_after_col(col)) 1951 break; 1948 1952 } 1949 1953 } 1950 1954 #endif 1951 1955 1956 /* 1957 * Like del_char(), but make sure not to go before column "limit_col". 1958 * Only matters when there are composing characters. 1959 * Return TRUE when something was deleted. 1960 */ 1961 /*ARGSUSED*/ 1962 static int 1963 del_char_after_col(limit_col) 1964 int limit_col; 1965 { 1966 #ifdef FEAT_MBYTE 1967 if (enc_utf8 && limit_col >= 0) 1968 { 1969 int ecol = curwin->w_cursor.col + 1; 1970 1971 /* Make sure the cursor is at the start of a character, but 1972 * skip forward again when going too far back because of a 1973 * composing character. */ 1974 mb_adjust_cursor(); 1975 while (curwin->w_cursor.col < (colnr_T)limit_col) 1976 { 1977 int l = utf_ptr2len(ml_get_cursor()); 1978 1979 if (l == 0) /* end of line */ 1980 break; 1981 curwin->w_cursor.col += l; 1982 } 1983 if (*ml_get_cursor() == NUL || curwin->w_cursor.col == ecol) 1984 return FALSE; 1985 del_bytes((long)(ecol - curwin->w_cursor.col), FALSE, TRUE); 1986 } 1987 else 1988 #endif 1989 (void)del_char(FALSE); 1990 return TRUE; 1991 } 1992 1952 1993 #if defined(FEAT_INS_EXPAND) || defined(PROTO) 1953 1994 /* 1954 1995 * CTRL-X pressed in Insert mode. … … 2418 2459 { 2419 2460 had_match = (curwin->w_cursor.col > compl_col); 2420 2461 ins_compl_delete(); 2421 ins_bytes(compl_leader + curwin->w_cursor.col - compl_col);2462 ins_bytes(compl_leader + ins_compl_len()); 2422 2463 ins_redraw(FALSE); 2423 2464 2424 2465 /* When the match isn't there (to avoid matching itself) remove it … … 2470 2511 *p = NUL; 2471 2512 had_match = (curwin->w_cursor.col > compl_col); 2472 2513 ins_compl_delete(); 2473 ins_bytes(compl_leader + curwin->w_cursor.col - compl_col);2514 ins_bytes(compl_leader + ins_compl_len()); 2474 2515 ins_redraw(FALSE); 2475 2516 2476 2517 /* When the match isn't there (to avoid matching itself) remove it … … 3209 3250 { 3210 3251 ins_compl_del_pum(); 3211 3252 ins_compl_delete(); 3212 ins_bytes(compl_leader + curwin->w_cursor.col - compl_col);3253 ins_bytes(compl_leader + ins_compl_len()); 3213 3254 compl_used_match = FALSE; 3214 3255 3215 3256 if (compl_started) … … 3264 3305 } 3265 3306 3266 3307 /* 3308 * Return the length of the completion, from the completion start column to 3309 * the cursor column. Making sure it never goes below zero. 3310 */ 3311 static int 3312 ins_compl_len() 3313 { 3314 int off = curwin->w_cursor.col - compl_col; 3315 3316 if (off < 0) 3317 return 0; 3318 return off; 3319 } 3320 3321 /* 3267 3322 * Append one character to the match leader. May reduce the number of 3268 3323 * matches. 3269 3324 */ … … 3621 3676 { 3622 3677 ins_compl_delete(); 3623 3678 if (compl_leader != NULL) 3624 ins_bytes(compl_leader + curwin->w_cursor.col - compl_col);3679 ins_bytes(compl_leader + ins_compl_len()); 3625 3680 else if (compl_first_match != NULL) 3626 ins_bytes(compl_orig_text 3627 + curwin->w_cursor.col - compl_col); 3681 ins_bytes(compl_orig_text + ins_compl_len()); 3628 3682 retval = TRUE; 3629 3683 } 3630 3684 … … 4187 4241 } 4188 4242 4189 4243 /* check if compl_curr_match has changed, (e.g. other type of 4190 * expansion added some nthing) */4244 * expansion added something) */ 4191 4245 if (type != 0 && compl_curr_match != old_match) 4192 4246 found_new_match = OK; 4193 4247 … … 4256 4310 static void 4257 4311 ins_compl_insert() 4258 4312 { 4259 ins_bytes(compl_shown_match->cp_str + curwin->w_cursor.col - compl_col);4313 ins_bytes(compl_shown_match->cp_str + ins_compl_len()); 4260 4314 if (compl_shown_match->cp_flags & ORIGINAL_TEXT) 4261 4315 compl_used_match = FALSE; 4262 4316 else … … 4425 4479 if (!compl_get_longest || compl_used_match) 4426 4480 ins_compl_insert(); 4427 4481 else 4428 ins_bytes(compl_leader + curwin->w_cursor.col - compl_col);4482 ins_bytes(compl_leader + ins_compl_len()); 4429 4483 } 4430 4484 else 4431 4485 compl_used_match = FALSE; … … 4688 4742 } 4689 4743 compl_length = curwin->w_cursor.col - (int)compl_col; 4690 4744 /* IObuff is used to add a "word from the next line" would we 4691 * have enough space? just being paranoi c*/4745 * have enough space? just being paranoid */ 4692 4746 #define MIN_SPACE 75 4693 4747 if (compl_length > (IOSIZE - MIN_SPACE)) 4694 4748 { … … 7123 7177 * cc == 0: character was inserted, delete it 7124 7178 * cc > 0: character was replaced, put cc (first byte of original char) back 7125 7179 * and check for more characters to be put back 7180 * When "limit_col" is >= 0, don't delete before this column. Matters when 7181 * using composing characters, use del_char_after_col() instead of del_char(). 7126 7182 */ 7127 7183 static void 7128 replace_do_bs() 7184 replace_do_bs(limit_col) 7185 int limit_col; 7129 7186 { 7130 7187 int cc; 7131 7188 #ifdef FEAT_VREPLACE … … 7153 7210 #ifdef FEAT_MBYTE 7154 7211 if (has_mbyte) 7155 7212 { 7156 del_char(FALSE);7213 (void)del_char_after_col(limit_col); 7157 7214 # ifdef FEAT_VREPLACE 7158 7215 if (State & VREPLACE_FLAG) 7159 7216 orig_len = (int)STRLEN(ml_get_cursor()); … … 7203 7260 changed_bytes(curwin->w_cursor.lnum, curwin->w_cursor.col); 7204 7261 } 7205 7262 else if (cc == 0) 7206 (void)del_char (FALSE);7263 (void)del_char_after_col(limit_col); 7207 7264 } 7208 7265 7209 7266 #ifdef FEAT_CINDENT … … 7646 7703 */ 7647 7704 ++no_mapping; 7648 7705 regname = plain_vgetc(); 7649 #ifdef FEAT_LANGMAP7650 7706 LANGMAP_ADJUST(regname, TRUE); 7651 #endif7652 7707 if (regname == Ctrl_R || regname == Ctrl_O || regname == Ctrl_P) 7653 7708 { 7654 7709 /* Get a third key for literal register insertion */ … … 7657 7712 add_to_showcmd_c(literally); 7658 7713 #endif 7659 7714 regname = plain_vgetc(); 7660 #ifdef FEAT_LANGMAP7661 7715 LANGMAP_ADJUST(regname, TRUE); 7662 #endif7663 7716 } 7664 7717 --no_mapping; 7665 7718 … … 8150 8203 /* 8151 8204 * If the cursor is on an indent, ^T/^D insert/delete one 8152 8205 * shiftwidth. Otherwise ^T/^D behave like a "<<" or ">>". 8153 * Always round the indent to 'shiftwi th', this is compatible8206 * Always round the indent to 'shiftwidth', this is compatible 8154 8207 * with vi. But vi only supports ^T and ^D after an 8155 8208 * autoindent, we support it everywhere. 8156 8209 */ … … 8239 8292 * Replace mode */ 8240 8293 if (curwin->w_cursor.lnum != Insstart.lnum 8241 8294 || curwin->w_cursor.col >= Insstart.col) 8242 replace_do_bs( );8295 replace_do_bs(-1); 8243 8296 } 8244 8297 else 8245 8298 (void)del_char(FALSE); … … 8556 8609 break; 8557 8610 } 8558 8611 if (State & REPLACE_FLAG) 8559 replace_do_bs( );8612 replace_do_bs(-1); 8560 8613 else 8561 8614 { 8562 8615 #ifdef FEAT_MBYTE -
src/eval.c
diff -Naur vim72.orig/src/eval.c vim72/src/eval.c
old new 32 32 33 33 #define DICT_MAXNEST 100 /* maximum nesting of lists and dicts */ 34 34 35 #define DO_NOT_FREE_CNT 99999 /* refcount for dict or list that should not 36 be freed. */ 37 35 38 /* 36 39 * In a hashtab item "hi_key" points to "di_key" in a dictitem. 37 40 * This avoids adding a pointer to the hashtab item. … … 348 351 {VV_NAME("mouse_col", VAR_NUMBER), 0}, 349 352 {VV_NAME("operator", VAR_STRING), VV_RO}, 350 353 {VV_NAME("searchforward", VAR_NUMBER), 0}, 354 {VV_NAME("oldfiles", VAR_LIST), 0}, 351 355 }; 352 356 353 357 /* shorthand */ … … 355 359 #define vv_nr vv_di.di_tv.vval.v_number 356 360 #define vv_float vv_di.di_tv.vval.v_float 357 361 #define vv_str vv_di.di_tv.vval.v_string 362 #define vv_list vv_di.di_tv.vval.v_list 358 363 #define vv_tv vv_di.di_tv 359 364 360 365 /* … … 426 431 static long list_idx_of_item __ARGS((list_T *l, listitem_T *item)); 427 432 static void list_append __ARGS((list_T *l, listitem_T *item)); 428 433 static int list_append_tv __ARGS((list_T *l, typval_T *tv)); 429 static int list_append_string __ARGS((list_T *l, char_u *str, int len));430 434 static int list_append_number __ARGS((list_T *l, varnumber_T n)); 431 435 static int list_insert_tv __ARGS((list_T *l, typval_T *tv, listitem_T *item)); 432 436 static int list_extend __ARGS((list_T *l1, list_T *l2, listitem_T *bef)); … … 788 792 static void func_unref __ARGS((char_u *name)); 789 793 static void func_ref __ARGS((char_u *name)); 790 794 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)); 795 static int can_free_funccal __ARGS((funccall_T *fc, int copyID)) ; 796 static void free_funccal __ARGS((funccall_T *fc, int free_val)); 791 797 static void add_nr_var __ARGS((dict_T *dp, dictitem_T *v, char *name, varnumber_T nr)); 792 798 static win_T *find_win_by_nr __ARGS((typval_T *vp, tabpage_T *tp)); 793 799 static void getwinvar __ARGS((typval_T *argvars, typval_T *rettv, int off)); … … 845 851 p = &vimvars[i]; 846 852 if (p->vv_di.di_tv.v_type == VAR_STRING) 847 853 { 848 vim_free(p->vv_di.di_tv.vval.v_string); 849 p->vv_di.di_tv.vval.v_string = NULL; 854 vim_free(p->vv_str); 855 p->vv_str = NULL; 856 } 857 else if (p->vv_di.di_tv.v_type == VAR_LIST) 858 { 859 list_unref(p->vv_list); 860 p->vv_list = NULL; 850 861 } 851 862 } 852 863 hash_clear(&vimvarht); 864 hash_init(&vimvarht); /* garbage_collect() will access it */ 853 865 hash_clear(&compat_hashtab); 854 866 855 867 /* script-local variables */ … … 916 928 /* pointer to funccal for currently active function */ 917 929 funccall_T *current_funccal = NULL; 918 930 931 /* pointer to list of previously used funccal, still around because some 932 * item in it is still being used. */ 933 funccall_T *previous_funccal = NULL; 934 919 935 /* 920 936 * Return TRUE when a function was ended by a ":return" command. 921 937 */ … … 1256 1272 1257 1273 /* 1258 1274 * Top level evaluation function, returning a string. 1275 * When "convert" is TRUE convert a List into a sequence of lines and convert 1276 * a Float to a String. 1259 1277 * Return pointer to allocated memory, or NULL for failure. 1260 1278 */ 1261 1279 char_u * 1262 eval_to_string(arg, nextcmd, dolist)1280 eval_to_string(arg, nextcmd, convert) 1263 1281 char_u *arg; 1264 1282 char_u **nextcmd; 1265 int dolist; /* turn List into sequence of lines */1283 int convert; 1266 1284 { 1267 1285 typval_T tv; 1268 1286 char_u *retval; 1269 1287 garray_T ga; 1288 char_u numbuf[NUMBUFLEN]; 1270 1289 1271 1290 if (eval0(arg, &tv, nextcmd, TRUE) == FAIL) 1272 1291 retval = NULL; 1273 1292 else 1274 1293 { 1275 if ( dolist && tv.v_type == VAR_LIST)1294 if (convert && tv.v_type == VAR_LIST) 1276 1295 { 1277 1296 ga_init2(&ga, (int)sizeof(char), 80); 1278 1297 if (tv.vval.v_list != NULL) … … 1280 1299 ga_append(&ga, NUL); 1281 1300 retval = (char_u *)ga.ga_data; 1282 1301 } 1302 #ifdef FEAT_FLOAT 1303 else if (convert && tv.v_type == VAR_FLOAT) 1304 { 1305 vim_snprintf((char *)numbuf, NUMBUFLEN, "%g", tv.vval.v_float); 1306 retval = vim_strsave(numbuf); 1307 } 1308 #endif 1283 1309 else 1284 1310 retval = vim_strsave(get_tv_string(&tv)); 1285 1311 clear_tv(&tv); … … 3277 3303 3278 3304 if (*startarg != '(') 3279 3305 { 3280 EMSG2(_("E107: Missing braces: %s"), eap->arg);3306 EMSG2(_("E107: Missing parentheses: %s"), eap->arg); 3281 3307 goto end; 3282 3308 } 3283 3309 … … 3657 3683 } 3658 3684 3659 3685 /* 3660 * Return TRUE if typeval "tv" is locked: Either tha value is locked itself or3661 * it refers to a List or Dictionary that is locked.3686 * Return TRUE if typeval "tv" is locked: Either that value is locked itself 3687 * or it refers to a List or Dictionary that is locked. 3662 3688 */ 3663 3689 static int 3664 3690 tv_islocked(tv) … … 3902 3928 3903 3929 /* 3904 3930 * Handle top level expression: 3905 * expr 1 ? expr0 : expr03931 * expr2 ? expr1 : expr1 3906 3932 * 3907 3933 * "arg" must point to the first non-white of the expression. 3908 3934 * "arg" is advanced to the next non-white after the recognized expression. … … 6047 6073 } 6048 6074 6049 6075 /* 6076 * Get list item "l[idx - 1]" as a string. Returns NULL for failure. 6077 */ 6078 char_u * 6079 list_find_str(l, idx) 6080 list_T *l; 6081 long idx; 6082 { 6083 listitem_T *li; 6084 6085 li = list_find(l, idx - 1); 6086 if (li == NULL) 6087 { 6088 EMSGN(_(e_listidx), idx); 6089 return NULL; 6090 } 6091 return get_tv_string(&li->li_tv); 6092 } 6093 6094 /* 6050 6095 * Locate "item" list "l" and return its index. 6051 6096 * Returns -1 when "item" is not in the list. 6052 6097 */ … … 6137 6182 * When "len" >= 0 use "str[len]". 6138 6183 * Returns FAIL when out of memory. 6139 6184 */ 6140 staticint6185 int 6141 6186 list_append_string(l, str, len) 6142 6187 list_T *l; 6143 6188 char_u *str; … … 6454 6499 buf_T *buf; 6455 6500 win_T *wp; 6456 6501 int i; 6457 funccall_T *fc ;6502 funccall_T *fc, **pfc; 6458 6503 int did_free = FALSE; 6459 6504 #ifdef FEAT_WINDOWS 6460 6505 tabpage_T *tp; … … 6497 6542 set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID); 6498 6543 } 6499 6544 6545 /* v: vars */ 6546 set_ref_in_ht(&vimvarht, copyID); 6547 6500 6548 /* 6501 6549 * 2. Go through the list of dicts and free items without the copyID. 6502 6550 */ … … 6535 6583 else 6536 6584 ll = ll->lv_used_next; 6537 6585 6586 /* check if any funccal can be freed now */ 6587 for (pfc = &previous_funccal; *pfc != NULL; ) 6588 { 6589 if (can_free_funccal(*pfc, copyID)) 6590 { 6591 fc = *pfc; 6592 *pfc = fc->caller; 6593 free_funccal(fc, TRUE); 6594 did_free = TRUE; 6595 } 6596 else 6597 pfc = &(*pfc)->caller; 6598 } 6599 6538 6600 return did_free; 6539 6601 } 6540 6602 … … 6587 6649 { 6588 6650 case VAR_DICT: 6589 6651 dd = tv->vval.v_dict; 6590 if (dd ->dv_copyID != copyID)6652 if (dd != NULL && dd->dv_copyID != copyID) 6591 6653 { 6592 6654 /* Didn't see this dict yet. */ 6593 6655 dd->dv_copyID = copyID; … … 6597 6659 6598 6660 case VAR_LIST: 6599 6661 ll = tv->vval.v_list; 6600 if (ll ->lv_copyID != copyID)6662 if (ll != NULL && ll->lv_copyID != copyID) 6601 6663 { 6602 6664 /* Didn't see this list yet. */ 6603 6665 ll->lv_copyID = copyID; … … 7525 7587 {"getwinposx", 0, 0, f_getwinposx}, 7526 7588 {"getwinposy", 0, 0, f_getwinposy}, 7527 7589 {"getwinvar", 2, 2, f_getwinvar}, 7528 {"glob", 1, 1, f_glob},7529 {"globpath", 2, 2, f_globpath},7590 {"glob", 1, 2, f_glob}, 7591 {"globpath", 2, 3, f_globpath}, 7530 7592 {"has", 1, 1, f_has}, 7531 7593 {"has_key", 2, 2, f_has_key}, 7532 7594 {"haslocaldir", 0, 0, f_haslocaldir}, … … 7856 7918 else if (!aborting()) 7857 7919 { 7858 7920 if (argcount == MAX_FUNC_ARGS) 7859 emsg_funcname( "E740: Too many arguments for function %s", name);7921 emsg_funcname(N_("E740: Too many arguments for function %s"), name); 7860 7922 else 7861 emsg_funcname( "E116: Invalid arguments for function %s", name);7923 emsg_funcname(N_("E116: Invalid arguments for function %s"), name); 7862 7924 } 7863 7925 7864 7926 while (--argcount >= 0) … … 8091 8153 8092 8154 /* 8093 8155 * Give an error message with a function name. Handle <SNR> things. 8156 * "ermsg" is to be passed without translation, use N_() instead of _(). 8094 8157 */ 8095 8158 static void 8096 8159 emsg_funcname(ermsg, name) … … 9518 9581 else 9519 9582 { 9520 9583 /* When the optional second argument is non-zero, don't remove matches 9521 * for ' suffixes' and 'wildignore'*/9584 * for 'wildignore' and don't put matches for 'suffixes' at the end. */ 9522 9585 if (argvars[1].v_type != VAR_UNKNOWN 9523 9586 && get_tv_number_chk(&argvars[1], &error)) 9524 9587 flags |= WILD_KEEP_ALL; … … 10300 10363 s = get_tv_string(&argvars[0]); 10301 10364 if (s == NULL || *s == NUL || VIM_ISDIGIT(*s)) 10302 10365 EMSG2(_(e_invarg2), s); 10303 else if (!function_exists(s)) 10366 /* Don't check an autoload name for existence here. */ 10367 else if (vim_strchr(s, AUTOLOAD_CHAR) == NULL && !function_exists(s)) 10304 10368 EMSG2(_("E700: Unknown function: %s"), s); 10305 10369 else 10306 10370 { … … 10602 10666 # ifdef FEAT_WINDOWS 10603 10667 win_T *wp; 10604 10668 # endif 10605 int n= 1;10669 int winnr = 1; 10606 10670 10607 10671 if (row >= 0 && col >= 0) 10608 10672 { … … 10612 10676 (void)mouse_comp_pos(win, &row, &col, &lnum); 10613 10677 # ifdef FEAT_WINDOWS 10614 10678 for (wp = firstwin; wp != win; wp = wp->w_next) 10615 ++ n;10679 ++winnr; 10616 10680 # endif 10617 vimvars[VV_MOUSE_WIN].vv_nr = n;10681 vimvars[VV_MOUSE_WIN].vv_nr = winnr; 10618 10682 vimvars[VV_MOUSE_LNUM].vv_nr = lnum; 10619 10683 vimvars[VV_MOUSE_COL].vv_nr = col + 1; 10620 10684 } … … 11284 11348 typval_T *argvars; 11285 11349 typval_T *rettv; 11286 11350 { 11351 int flags = WILD_SILENT|WILD_USE_NL; 11287 11352 expand_T xpc; 11353 int error = FALSE; 11288 11354 11289 ExpandInit(&xpc); 11290 xpc.xp_context = EXPAND_FILES; 11355 /* When the optional second argument is non-zero, don't remove matches 11356 * for 'wildignore' and don't put matches for 'suffixes' at the end. */ 11357 if (argvars[1].v_type != VAR_UNKNOWN 11358 && get_tv_number_chk(&argvars[1], &error)) 11359 flags |= WILD_KEEP_ALL; 11291 11360 rettv->v_type = VAR_STRING; 11292 rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]), 11293 NULL, WILD_USE_NL|WILD_SILENT, WILD_ALL); 11361 if (!error) 11362 { 11363 ExpandInit(&xpc); 11364 xpc.xp_context = EXPAND_FILES; 11365 rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]), 11366 NULL, flags, WILD_ALL); 11367 } 11368 else 11369 rettv->vval.v_string = NULL; 11294 11370 } 11295 11371 11296 11372 /* … … 11301 11377 typval_T *argvars; 11302 11378 typval_T *rettv; 11303 11379 { 11380 int flags = 0; 11304 11381 char_u buf1[NUMBUFLEN]; 11305 11382 char_u *file = get_tv_string_buf_chk(&argvars[1], buf1); 11383 int error = FALSE; 11306 11384 11385 /* When the optional second argument is non-zero, don't remove matches 11386 * for 'wildignore' and don't put matches for 'suffixes' at the end. */ 11387 if (argvars[2].v_type != VAR_UNKNOWN 11388 && get_tv_number_chk(&argvars[2], &error)) 11389 flags |= WILD_KEEP_ALL; 11307 11390 rettv->v_type = VAR_STRING; 11308 if (file == NULL )11391 if (file == NULL || error) 11309 11392 rettv->vval.v_string = NULL; 11310 11393 else 11311 rettv->vval.v_string = globpath(get_tv_string(&argvars[0]), file); 11394 rettv->vval.v_string = globpath(get_tv_string(&argvars[0]), file, 11395 flags); 11312 11396 } 11313 11397 11314 11398 /* … … 11782 11866 n = has_patch(atoi((char *)name + 5)); 11783 11867 else if (STRICMP(name, "vim_starting") == 0) 11784 11868 n = (starting != 0); 11869 #ifdef FEAT_MBYTE 11870 else if (STRICMP(name, "multi_byte_encoding") == 0) 11871 n = has_mbyte; 11872 #endif 11785 11873 #if defined(FEAT_BEVAL) && defined(FEAT_GUI_W32) 11786 11874 else if (STRICMP(name, "balloon_multiline") == 0) 11787 11875 n = multiline_balloon_available(); … … 15838 15926 if (res == FAIL) 15839 15927 res = ITEM_COMPARE_FAIL; 15840 15928 else 15841 /* return value has wrong type */15842 15929 res = get_tv_number_chk(&rettv, &item_compare_func_err); 15843 15930 if (item_compare_func_err) 15844 res = ITEM_COMPARE_FAIL; 15931 res = ITEM_COMPARE_FAIL; /* return value has wrong type */ 15845 15932 clear_tv(&rettv); 15846 15933 return res; 15847 15934 } … … 16590 16677 p = highlight_has_attr(id, HL_INVERSE, modec); 16591 16678 break; 16592 16679 16593 case 's': /* standout */ 16594 p = highlight_has_attr(id, HL_STANDOUT, modec); 16680 case 's': 16681 if (TOLOWER_ASC(what[1]) == 'p') /* sp[#] */ 16682 p = highlight_color(id, what, modec); 16683 else /* standout */ 16684 p = highlight_has_attr(id, HL_STANDOUT, modec); 16595 16685 break; 16596 16686 16597 16687 case 'u': … … 16658 16748 col = get_tv_number(&argvars[1]) - 1; /* -1 on type error */ 16659 16749 16660 16750 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count 16661 && col >= 0 && col < (long)STRLEN(ml_get(lnum))16751 && col >= 0 && (col == 0 || col < (long)STRLEN(ml_get(lnum))) 16662 16752 && rettv_list_alloc(rettv) != FAIL) 16663 16753 { 16664 16754 (void)syn_get_id(curwin, lnum, (colnr_T)col, FALSE, NULL, TRUE); … … 18097 18187 } 18098 18188 18099 18189 /* 18100 * Set v:count, v:count1 and v:prevcount. 18190 * Get List v: variable value. Caller must take care of reference count when 18191 * needed. 18192 */ 18193 list_T * 18194 get_vim_var_list(idx) 18195 int idx; 18196 { 18197 return vimvars[idx].vv_list; 18198 } 18199 18200 /* 18201 * Set v:count to "count" and v:count1 to "count1". 18202 * When "set_prevcount" is TRUE first set v:prevcount from v:count. 18101 18203 */ 18102 18204 void 18103 set_vcount(count, count1 )18205 set_vcount(count, count1, set_prevcount) 18104 18206 long count; 18105 18207 long count1; 18208 int set_prevcount; 18106 18209 { 18107 vimvars[VV_PREVCOUNT].vv_nr = vimvars[VV_COUNT].vv_nr; 18210 if (set_prevcount) 18211 vimvars[VV_PREVCOUNT].vv_nr = vimvars[VV_COUNT].vv_nr; 18108 18212 vimvars[VV_COUNT].vv_nr = count; 18109 18213 vimvars[VV_COUNT1].vv_nr = count1; 18110 18214 } … … 18132 18236 } 18133 18237 18134 18238 /* 18239 * Set List v: variable to "val". 18240 */ 18241 void 18242 set_vim_var_list(idx, val) 18243 int idx; 18244 list_T *val; 18245 { 18246 list_unref(vimvars[idx].vv_list); 18247 vimvars[idx].vv_list = val; 18248 if (val != NULL) 18249 ++val->lv_refcount; 18250 } 18251 18252 /* 18135 18253 * Set v:register if needed. 18136 18254 */ 18137 18255 void … … 18868 18986 dictitem_T *dict_var; 18869 18987 { 18870 18988 hash_init(&dict->dv_hashtab); 18871 dict->dv_refcount = 99999;18989 dict->dv_refcount = DO_NOT_FREE_CNT; 18872 18990 dict_var->di_tv.vval.v_dict = dict; 18873 18991 dict_var->di_tv.v_type = VAR_DICT; 18874 18992 dict_var->di_tv.v_lock = VAR_FIXED; … … 19205 19323 * Copy the values from typval_T "from" to typval_T "to". 19206 19324 * When needed allocates string or increases reference count. 19207 19325 * Does not make a copy of a list or dict but copies the reference! 19326 * It is OK for "from" and "to" to point to the same item. This is used to 19327 * make a copy later. 19208 19328 */ 19209 19329 static void 19210 19330 copy_tv(from, to) … … 19748 19868 } 19749 19869 } 19750 19870 else 19751 emsg_funcname( "E123: Undefined function: %s", name);19871 emsg_funcname(N_("E123: Undefined function: %s"), name); 19752 19872 } 19753 19873 goto ret_free; 19754 19874 } … … 19792 19912 : eval_isnamec(arg[j]))) 19793 19913 ++j; 19794 19914 if (arg[j] != NUL) 19795 emsg_funcname( _(e_invarg2), arg);19915 emsg_funcname((char *)e_invarg2, arg); 19796 19916 } 19797 19917 } 19798 19918 … … 20064 20184 v = find_var(name, &ht); 20065 20185 if (v != NULL && v->di_tv.v_type == VAR_FUNC) 20066 20186 { 20067 emsg_funcname( "E707: Function name conflicts with variable: %s",20187 emsg_funcname(N_("E707: Function name conflicts with variable: %s"), 20068 20188 name); 20069 20189 goto erret; 20070 20190 } … … 20079 20199 } 20080 20200 if (fp->uf_calls > 0) 20081 20201 { 20082 emsg_funcname( "E127: Cannot redefine function %s: It is in use",20202 emsg_funcname(N_("E127: Cannot redefine function %s: It is in use"), 20083 20203 name); 20084 20204 goto erret; 20085 20205 } … … 20590 20710 int st_len = 0; 20591 20711 20592 20712 todo = (int)func_hashtab.ht_used; 20713 if (todo == 0) 20714 return; /* nothing to dump */ 20715 20593 20716 sorttab = (ufunc_T **)alloc((unsigned)(sizeof(ufunc_T) * todo)); 20594 20717 20595 20718 for (hi = func_hashtab.ht_array; todo > 0; ++hi) … … 20638 20761 prof_self_cmp); 20639 20762 prof_sort_list(fd, sorttab, st_len, "SELF", TRUE); 20640 20763 } 20764 20765 vim_free(sorttab); 20641 20766 } 20642 20767 20643 20768 static void … … 21012 21137 char_u *save_sourcing_name; 21013 21138 linenr_T save_sourcing_lnum; 21014 21139 scid_T save_current_SID; 21015 funccall_T fc;21140 funccall_T *fc; 21016 21141 int save_did_emsg; 21017 21142 static int depth = 0; 21018 21143 dictitem_T *v; … … 21038 21163 21039 21164 line_breakcheck(); /* check for CTRL-C hit */ 21040 21165 21041 fc.caller = current_funccal; 21042 current_funccal = &fc; 21043 fc.func = fp; 21044 fc.rettv = rettv; 21166 fc = (funccall_T *)alloc(sizeof(funccall_T)); 21167 fc->caller = current_funccal; 21168 current_funccal = fc; 21169 fc->func = fp; 21170 fc->rettv = rettv; 21045 21171 rettv->vval.v_number = 0; 21046 fc .linenr = 0;21047 fc .returned = FALSE;21048 fc .level = ex_nesting_level;21172 fc->linenr = 0; 21173 fc->returned = FALSE; 21174 fc->level = ex_nesting_level; 21049 21175 /* Check if this function has a breakpoint. */ 21050 fc .breakpoint = dbg_find_breakpoint(FALSE, fp->uf_name, (linenr_T)0);21051 fc .dbg_tick = debug_tick;21176 fc->breakpoint = dbg_find_breakpoint(FALSE, fp->uf_name, (linenr_T)0); 21177 fc->dbg_tick = debug_tick; 21052 21178 21053 21179 /* 21054 * Note about using fc .fixvar[]: This is an array of FIXVAR_CNT variables21180 * Note about using fc->fixvar[]: This is an array of FIXVAR_CNT variables 21055 21181 * with names up to VAR_SHORT_LEN long. This avoids having to alloc/free 21056 21182 * each argument variable and saves a lot of time. 21057 21183 */ 21058 21184 /* 21059 21185 * Init l: variables. 21060 21186 */ 21061 init_var_dict(&fc .l_vars, &fc.l_vars_var);21187 init_var_dict(&fc->l_vars, &fc->l_vars_var); 21062 21188 if (selfdict != NULL) 21063 21189 { 21064 21190 /* Set l:self to "selfdict". Use "name" to avoid a warning from 21065 21191 * some compiler that checks the destination size. */ 21066 v = &fc .fixvar[fixvar_idx++].var;21192 v = &fc->fixvar[fixvar_idx++].var; 21067 21193 name = v->di_key; 21068 21194 STRCPY(name, "self"); 21069 21195 v->di_flags = DI_FLAGS_RO + DI_FLAGS_FIX; 21070 hash_add(&fc .l_vars.dv_hashtab, DI2HIKEY(v));21196 hash_add(&fc->l_vars.dv_hashtab, DI2HIKEY(v)); 21071 21197 v->di_tv.v_type = VAR_DICT; 21072 21198 v->di_tv.v_lock = 0; 21073 21199 v->di_tv.vval.v_dict = selfdict; … … 21079 21205 * Set a:0 to "argcount". 21080 21206 * Set a:000 to a list with room for the "..." arguments. 21081 21207 */ 21082 init_var_dict(&fc .l_avars, &fc.l_avars_var);21083 add_nr_var(&fc .l_avars, &fc.fixvar[fixvar_idx++].var, "0",21208 init_var_dict(&fc->l_avars, &fc->l_avars_var); 21209 add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "0", 21084 21210 (varnumber_T)(argcount - fp->uf_args.ga_len)); 21085 v = &fc.fixvar[fixvar_idx++].var; 21086 STRCPY(v->di_key, "000"); 21211 /* Use "name" to avoid a warning from some compiler that checks the 21212 * destination size. */ 21213 v = &fc->fixvar[fixvar_idx++].var; 21214 name = v->di_key; 21215 STRCPY(name, "000"); 21087 21216 v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX; 21088 hash_add(&fc .l_avars.dv_hashtab, DI2HIKEY(v));21217 hash_add(&fc->l_avars.dv_hashtab, DI2HIKEY(v)); 21089 21218 v->di_tv.v_type = VAR_LIST; 21090 21219 v->di_tv.v_lock = VAR_FIXED; 21091 v->di_tv.vval.v_list = &fc .l_varlist;21092 vim_memset(&fc .l_varlist, 0, sizeof(list_T));21093 fc .l_varlist.lv_refcount = 99999;21094 fc .l_varlist.lv_lock = VAR_FIXED;21220 v->di_tv.vval.v_list = &fc->l_varlist; 21221 vim_memset(&fc->l_varlist, 0, sizeof(list_T)); 21222 fc->l_varlist.lv_refcount = DO_NOT_FREE_CNT; 21223 fc->l_varlist.lv_lock = VAR_FIXED; 21095 21224 21096 21225 /* 21097 21226 * Set a:firstline to "firstline" and a:lastline to "lastline". 21098 21227 * Set a:name to named arguments. 21099 21228 * Set a:N to the "..." arguments. 21100 21229 */ 21101 add_nr_var(&fc .l_avars, &fc.fixvar[fixvar_idx++].var, "firstline",21230 add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "firstline", 21102 21231 (varnumber_T)firstline); 21103 add_nr_var(&fc .l_avars, &fc.fixvar[fixvar_idx++].var, "lastline",21232 add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "lastline", 21104 21233 (varnumber_T)lastline); 21105 21234 for (i = 0; i < argcount; ++i) 21106 21235 { … … 21116 21245 } 21117 21246 if (fixvar_idx < FIXVAR_CNT && STRLEN(name) <= VAR_SHORT_LEN) 21118 21247 { 21119 v = &fc .fixvar[fixvar_idx++].var;21248 v = &fc->fixvar[fixvar_idx++].var; 21120 21249 v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX; 21121 21250 } 21122 21251 else … … 21128 21257 v->di_flags = DI_FLAGS_RO; 21129 21258 } 21130 21259 STRCPY(v->di_key, name); 21131 hash_add(&fc .l_avars.dv_hashtab, DI2HIKEY(v));21260 hash_add(&fc->l_avars.dv_hashtab, DI2HIKEY(v)); 21132 21261 21133 21262 /* Note: the values are copied directly to avoid alloc/free. 21134 21263 * "argvars" must have VAR_FIXED for v_lock. */ … … 21137 21266 21138 21267 if (ai >= 0 && ai < MAX_FUNC_ARGS) 21139 21268 { 21140 list_append(&fc .l_varlist, &fc.l_listitems[ai]);21141 fc .l_listitems[ai].li_tv = argvars[i];21142 fc .l_listitems[ai].li_tv.v_lock = VAR_FIXED;21269 list_append(&fc->l_varlist, &fc->l_listitems[ai]); 21270 fc->l_listitems[ai].li_tv = argvars[i]; 21271 fc->l_listitems[ai].li_tv.v_lock = VAR_FIXED; 21143 21272 } 21144 21273 } 21145 21274 … … 21204 21333 if (!fp->uf_profiling && has_profiling(FALSE, fp->uf_name, NULL)) 21205 21334 func_do_profile(fp); 21206 21335 if (fp->uf_profiling 21207 || (fc.caller != NULL && &fc.caller->func->uf_profiling))21336 || (fc->caller != NULL && fc->caller->func->uf_profiling)) 21208 21337 { 21209 21338 ++fp->uf_tm_count; 21210 21339 profile_start(&call_start); … … 21220 21349 did_emsg = FALSE; 21221 21350 21222 21351 /* call do_cmdline() to execute the lines */ 21223 do_cmdline(NULL, get_func_line, (void *) &fc,21352 do_cmdline(NULL, get_func_line, (void *)fc, 21224 21353 DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT); 21225 21354 21226 21355 --RedrawingDisabled; … … 21235 21364 21236 21365 #ifdef FEAT_PROFILE 21237 21366 if (do_profiling == PROF_YES && (fp->uf_profiling 21238 || (fc .caller != NULL && &fc.caller->func->uf_profiling)))21367 || (fc->caller != NULL && fc->caller->func->uf_profiling))) 21239 21368 { 21240 21369 profile_end(&call_start); 21241 21370 profile_sub_wait(&wait_start, &call_start); 21242 21371 profile_add(&fp->uf_tm_total, &call_start); 21243 21372 profile_self(&fp->uf_tm_self, &call_start, &fp->uf_tm_children); 21244 if (fc .caller != NULL && &fc.caller->func->uf_profiling)21373 if (fc->caller != NULL && fc->caller->func->uf_profiling) 21245 21374 { 21246 profile_add(&fc .caller->func->uf_tm_children, &call_start);21247 profile_add(&fc .caller->func->uf_tml_children, &call_start);21375 profile_add(&fc->caller->func->uf_tm_children, &call_start); 21376 profile_add(&fc->caller->func->uf_tml_children, &call_start); 21248 21377 } 21249 21378 } 21250 21379 #endif … … 21257 21386 21258 21387 if (aborting()) 21259 21388 smsg((char_u *)_("%s aborted"), sourcing_name); 21260 else if (fc .rettv->v_type == VAR_NUMBER)21389 else if (fc->rettv->v_type == VAR_NUMBER) 21261 21390 smsg((char_u *)_("%s returning #%ld"), sourcing_name, 21262 (long)fc .rettv->vval.v_number);21391 (long)fc->rettv->vval.v_number); 21263 21392 else 21264 21393 { 21265 21394 char_u buf[MSG_BUF_LEN]; … … 21270 21399 /* The value may be very long. Skip the middle part, so that we 21271 21400 * have some idea how it starts and ends. smsg() would always 21272 21401 * truncate it at the end. */ 21273 s = tv2string(fc .rettv, &tofree, numbuf2, 0);21402 s = tv2string(fc->rettv, &tofree, numbuf2, 0); 21274 21403 if (s != NULL) 21275 21404 { 21276 21405 trunc_string(s, buf, MSG_BUF_CLEN); … … 21306 21435 } 21307 21436 21308 21437 did_emsg |= save_did_emsg; 21309 current_funccal = fc.caller; 21438 current_funccal = fc->caller; 21439 --depth; 21310 21440 21311 /* The a: variables typevals were not allocated, only free the allocated 21312 * variables. */ 21313 vars_clear_ext(&fc.l_avars.dv_hashtab, FALSE); 21441 /* if the a:000 list and the a: dict are not referenced we can free the 21442 * funccall_T and what's in it. */ 21443 if (fc->l_varlist.lv_refcount == DO_NOT_FREE_CNT 21444 && fc->l_vars.dv_refcount == DO_NOT_FREE_CNT 21445 && fc->l_avars.dv_refcount == DO_NOT_FREE_CNT) 21446 { 21447 free_funccal(fc, FALSE); 21448 } 21449 else 21450 { 21451 hashitem_T *hi; 21452 listitem_T *li; 21453 int todo; 21314 21454 21315 vars_clear(&fc.l_vars.dv_hashtab); /* free all l: variables */ 21316 --depth; 21455 /* "fc" is still in use. This can happen when returning "a:000" or 21456 * assigning "l:" to a global variable. 21457 * Link "fc" in the list for garbage collection later. */ 21458 fc->caller = previous_funccal; 21459 previous_funccal = fc; 21460 21461 /* Make a copy of the a: variables, since we didn't do that above. */ 21462 todo = (int)fc->l_avars.dv_hashtab.ht_used; 21463 for (hi = fc->l_avars.dv_hashtab.ht_array; todo > 0; ++hi) 21464 { 21465 if (!HASHITEM_EMPTY(hi)) 21466 { 21467 --todo; 21468 v = HI2DI(hi); 21469 copy_tv(&v->di_tv, &v->di_tv); 21470 } 21471 } 21472 21473 /* Make a copy of the a:000 items, since we didn't do that above. */ 21474 for (li = fc->l_varlist.lv_first; li != NULL; li = li->li_next) 21475 copy_tv(&li->li_tv, &li->li_tv); 21476 } 21477 } 21478 21479 /* 21480 * Return TRUE if items in "fc" do not have "copyID". That means they are not 21481 * referenced from anywhere. 21482 */ 21483 static int 21484 can_free_funccal(fc, copyID) 21485 funccall_T *fc; 21486 int copyID; 21487 { 21488 return (fc->l_varlist.lv_copyID != copyID 21489 && fc->l_vars.dv_copyID != copyID 21490 && fc->l_avars.dv_copyID != copyID); 21491 } 21492 21493 /* 21494 * Free "fc" and what it contains. 21495 */ 21496 static void 21497 free_funccal(fc, free_val) 21498 funccall_T *fc; 21499 int free_val; /* a: vars were allocated */ 21500 { 21501 listitem_T *li; 21502 21503 /* The a: variables typevals may not have been allocated, only free the 21504 * allocated variables. */ 21505 vars_clear_ext(&fc->l_avars.dv_hashtab, free_val); 21506 21507 /* free all l: variables */ 21508 vars_clear(&fc->l_vars.dv_hashtab); 21509 21510 /* Free the a:000 variables if they were allocated. */ 21511 if (free_val) 21512 for (li = fc->l_varlist.lv_first; li != NULL; li = li->li_next) 21513 clear_tv(&li->li_tv); 21514 21515 vim_free(fc); 21317 21516 } 21318 21517 21319 21518 /* … … 21886 22085 } 21887 22086 } 21888 22087 22088 /* 22089 * List v:oldfiles in a nice way. 22090 */ 22091 /*ARGSUSED*/ 22092 void 22093 ex_oldfiles(eap) 22094 exarg_T *eap; 22095 { 22096 list_T *l = vimvars[VV_OLDFILES].vv_list; 22097 listitem_T *li; 22098 int nr = 0; 22099 22100 if (l == NULL) 22101 msg((char_u *)_("No old files")); 22102 else 22103 { 22104 msg_start(); 22105 msg_scroll = TRUE; 22106 for (li = l->lv_first; li != NULL && !got_int; li = li->li_next) 22107 { 22108 msg_outnum((long)++nr); 22109 MSG_PUTS(": "); 22110 msg_outtrans(get_tv_string(&li->li_tv)); 22111 msg_putchar('\n'); 22112 out_flush(); /* output one line at a time */ 22113 ui_breakcheck(); 22114 } 22115 /* Assume "got_int" was set to truncate the listing. */ 22116 got_int = FALSE; 22117 22118 #ifdef FEAT_BROWSE_CMD 22119 if (cmdmod.browse) 22120 { 22121 quit_more = FALSE; 22122 nr = prompt_for_number(FALSE); 22123 msg_starthere(); 22124 if (nr > 0) 22125 { 22126 char_u *p = list_find_str(get_vim_var_list(VV_OLDFILES), 22127 (long)nr); 22128 22129 if (p != NULL) 22130 { 22131 p = expand_env_save(p); 22132 eap->arg = p; 22133 eap->cmdidx = CMD_edit; 22134 cmdmod.browse = FALSE; 22135 do_exedit(eap, NULL); 22136 vim_free(p); 22137 } 22138 } 22139 } 22140 #endif 22141 } 22142 } 22143 21889 22144 #endif /* FEAT_EVAL */ 21890 22145 21891 22146 -
src/ex_cmds2.c
diff -Naur vim72.orig/src/ex_cmds2.c vim72/src/ex_cmds2.c
old new 2842 2842 linenr_T save_sourcing_lnum; 2843 2843 char_u *p; 2844 2844 char_u *fname_exp; 2845 char_u *firstline = NULL; 2845 2846 int retval = FAIL; 2846 2847 #ifdef FEAT_EVAL 2847 2848 scid_T save_current_SID; … … 2992 2993 2993 2994 cookie.level = ex_nesting_level; 2994 2995 #endif 2995 #ifdef FEAT_MBYTE2996 cookie.conv.vc_type = CONV_NONE; /* no conversion */2997 2998 /* Try reading the first few bytes to check for a UTF-8 BOM. */2999 {3000 char_u buf[3];3001 3002 if (fread((char *)buf, sizeof(char_u), (size_t)3, cookie.fp)3003 == (size_t)33004 && buf[0] == 0xef && buf[1] == 0xbb && buf[2] == 0xbf)3005 /* Found BOM, setup conversion and skip over it. */3006 convert_setup(&cookie.conv, (char_u *)"utf-8", p_enc);3007 else3008 /* No BOM found, rewind. */3009 fseek(cookie.fp, 0L, SEEK_SET);3010 }3011 #endif3012 2996 3013 2997 /* 3014 2998 * Keep the sourcing name/lnum, for recursive calls. … … 3018 3002 save_sourcing_lnum = sourcing_lnum; 3019 3003 sourcing_lnum = 0; 3020 3004 3005 #ifdef FEAT_MBYTE 3006 cookie.conv.vc_type = CONV_NONE; /* no conversion */ 3007 3008 /* Read the first line so we can check for a UTF-8 BOM. */ 3009 firstline = getsourceline(0, (void *)&cookie, 0); 3010 if (firstline != NULL && STRLEN(firstline) >= 3 && firstline[0] == 0xef 3011 && firstline[1] == 0xbb && firstline[2] == 0xbf) 3012 { 3013 /* Found BOM; setup conversion, skip over BOM and recode the line. */ 3014 convert_setup(&cookie.conv, (char_u *)"utf-8", p_enc); 3015 p = string_convert(&cookie.conv, firstline + 3, NULL); 3016 if (p == NULL) 3017 p = vim_strsave(firstline + 3); 3018 if (p != NULL) 3019 { 3020 vim_free(firstline); 3021 firstline = p; 3022 } 3023 } 3024 #endif 3025 3021 3026 #ifdef STARTUPTIME 3022 3027 time_push(&tv_rel, &tv_start); 3023 3028 #endif … … 3111 3116 /* 3112 3117 * Call do_cmdline, which will call getsourceline() to get the lines. 3113 3118 */ 3114 do_cmdline( NULL, getsourceline, (void *)&cookie,3119 do_cmdline(firstline, getsourceline, (void *)&cookie, 3115 3120 DOCMD_VERBOSE|DOCMD_NOWAIT|DOCMD_REPEAT); 3116 3117 3121 retval = OK; 3118 3122 3119 3123 #ifdef FEAT_PROFILE … … 3145 3149 verbose_leave(); 3146 3150 } 3147 3151 #ifdef STARTUPTIME 3148 vim_snprintf( IObuff, IOSIZE, "sourcing %s", fname);3149 time_msg( IObuff, &tv_start);3152 vim_snprintf((char *)IObuff, IOSIZE, "sourcing %s", fname); 3153 time_msg((char *)IObuff, &tv_start); 3150 3154 time_pop(&tv_rel); 3151 3155 #endif 3152 3156 … … 3171 3175 #endif 3172 3176 fclose(cookie.fp); 3173 3177 vim_free(cookie.nextline); 3178 vim_free(firstline); 3174 3179 #ifdef FEAT_MBYTE 3175 3180 convert_setup(&cookie.conv, NULL, NULL); 3176 3181 #endif -
src/ex_cmds.c
diff -Naur vim72.orig/src/ex_cmds.c vim72/src/ex_cmds.c
old new 24 24 static void do_filter __ARGS((linenr_T line1, linenr_T line2, exarg_T *eap, char_u *cmd, int do_in, int do_out)); 25 25 #ifdef FEAT_VIMINFO 26 26 static char_u *viminfo_filename __ARGS((char_u *)); 27 static void do_viminfo __ARGS((FILE *fp_in, FILE *fp_out, int want_info, int want_marks, int force_read));27 static void do_viminfo __ARGS((FILE *fp_in, FILE *fp_out, int flags)); 28 28 static int viminfo_encoding __ARGS((vir_T *virp)); 29 29 static int read_viminfo_up_to_marks __ARGS((vir_T *virp, int forceit, int writing)); 30 30 #endif … … 49 49 exarg_T *eap; 50 50 { 51 51 int c; 52 int cval; 52 53 char buf1[20]; 53 54 char buf2[20]; 54 55 char_u buf3[7]; … … 75 76 { 76 77 if (c == NL) /* NUL is stored as NL */ 77 78 c = NUL; 79 if (c == CAR && get_fileformat(curbuf) == EOL_MAC) 80 cval = NL; /* NL is stored as CR */ 81 else 82 cval = c; 78 83 if (vim_isprintc_strict(c) && (c < ' ' 79 84 #ifndef EBCDIC 80 85 || c > '~' … … 94 99 buf2[0] = NUL; 95 100 vim_snprintf((char *)IObuff, IOSIZE, 96 101 _("<%s>%s%s %d, Hex %02x, Octal %03o"), 97 transchar(c), buf1, buf2, c, c, c);102 transchar(c), buf1, buf2, cval, cval, cval); 98 103 #ifdef FEAT_MBYTE 99 104 if (enc_utf8) 100 105 c = cc[ci++]; … … 1676 1681 1677 1682 /* 1678 1683 * read_viminfo() -- Read the viminfo file. Registers etc. which are already 1679 * set are not over-written unless force is TRUE. -- webb1684 * set are not over-written unless "flags" includes VIF_FORCEIT. -- webb 1680 1685 */ 1681 1686 int 1682 read_viminfo(file, want_info, want_marks, forceit) 1683 char_u *file; 1684 int want_info; 1685 int want_marks; 1686 int forceit; 1687 read_viminfo(file, flags) 1688 char_u *file; /* file name or NULL to use default name */ 1689 int flags; /* VIF_WANT_INFO et al. */ 1687 1690 { 1688 1691 FILE *fp; 1689 1692 char_u *fname; … … 1691 1694 if (no_viminfo()) 1692 1695 return FAIL; 1693 1696 1694 fname = viminfo_filename(file); /* may set to default if NULL*/1697 fname = viminfo_filename(file); /* get file name in allocated buffer */ 1695 1698 if (fname == NULL) 1696 1699 return FAIL; 1697 1700 fp = mch_fopen((char *)fname, READBIN); … … 1701 1704 verbose_enter(); 1702 1705 smsg((char_u *)_("Reading viminfo file \"%s\"%s%s%s"), 1703 1706 fname, 1704 want_info ? _(" info") : "", 1705 want_marks ? _(" marks") : "", 1707 (flags & VIF_WANT_INFO) ? _(" info") : "", 1708 (flags & VIF_WANT_MARKS) ? _(" marks") : "", 1709 (flags & VIF_GET_OLDFILES) ? _(" oldfiles") : "", 1706 1710 fp == NULL ? _(" FAILED") : ""); 1707 1711 verbose_leave(); 1708 1712 } … … 1712 1716 return FAIL; 1713 1717 1714 1718 viminfo_errcnt = 0; 1715 do_viminfo(fp, NULL, want_info, want_marks, forceit);1719 do_viminfo(fp, NULL, flags); 1716 1720 1717 1721 fclose(fp); 1718 1719 1722 return OK; 1720 1723 } 1721 1724 … … 1943 1946 * root. 1944 1947 */ 1945 1948 if (fp_out != NULL) 1946 (void)fchown(fileno(fp_out), st_old.st_uid, st_old.st_gid);1949 ignored = fchown(fileno(fp_out), st_old.st_uid, st_old.st_gid); 1947 1950 #endif 1948 1951 } 1949 1952 } … … 1968 1971 } 1969 1972 1970 1973 viminfo_errcnt = 0; 1971 do_viminfo(fp_in, fp_out, !forceit, !forceit, FALSE);1974 do_viminfo(fp_in, fp_out, forceit ? 0 : (VIF_WANT_INFO | VIF_WANT_MARKS)); 1972 1975 1973 1976 fclose(fp_out); /* errors are ignored !? */ 1974 1977 if (fp_in != NULL) … … 2041 2044 * do_viminfo() -- Should only be called from read_viminfo() & write_viminfo(). 2042 2045 */ 2043 2046 static void 2044 do_viminfo(fp_in, fp_out, want_info, want_marks, force_read)2047 do_viminfo(fp_in, fp_out, flags) 2045 2048 FILE *fp_in; 2046 2049 FILE *fp_out; 2047 int want_info; 2048 int want_marks; 2049 int force_read; 2050 int flags; 2050 2051 { 2051 2052 int count = 0; 2052 2053 int eof = FALSE; … … 2061 2062 2062 2063 if (fp_in != NULL) 2063 2064 { 2064 if (want_info) 2065 eof = read_viminfo_up_to_marks(&vir, force_read, fp_out != NULL); 2065 if (flags & VIF_WANT_INFO) 2066 eof = read_viminfo_up_to_marks(&vir, 2067 flags & VIF_FORCEIT, fp_out != NULL); 2066 2068 else 2067 2069 /* Skip info, find start of marks */ 2068 2070 while (!(eof = viminfo_readline(&vir)) … … 2092 2094 write_viminfo_bufferlist(fp_out); 2093 2095 count = write_viminfo_marks(fp_out); 2094 2096 } 2095 if (fp_in != NULL && want_marks) 2096 copy_viminfo_marks(&vir, fp_out, count, eof); 2097 if (fp_in != NULL 2098 && (flags & (VIF_WANT_MARKS | VIF_GET_OLDFILES | VIF_FORCEIT))) 2099 copy_viminfo_marks(&vir, fp_out, count, eof, flags); 2097 2100 2098 2101 vim_free(vir.vir_line); 2099 2102 #ifdef FEAT_MBYTE … … 2414 2417 cursor_on(); /* msg_start() switches it off */ 2415 2418 out_flush(); 2416 2419 silent_mode = save_silent; 2417 info_message = FALSE;2418 2420 } 2421 info_message = FALSE; 2419 2422 } 2420 2423 2421 2424 /* … … 2704 2707 if (eap->cmdidx == CMD_saveas) 2705 2708 { 2706 2709 if (retval == OK) 2710 { 2707 2711 curbuf->b_p_ro = FALSE; 2712 #ifdef FEAT_WINDOWS 2713 redraw_tabline = TRUE; 2714 #endif 2715 } 2708 2716 /* Change directories when the 'acd' option is set. */ 2709 2717 DO_AUTOCHDIR 2710 2718 } … … 5059 5067 5060 5068 if (did_sub) 5061 5069 ++sub_nlines; 5070 vim_free(new_start); /* for when substitute was cancelled */ 5062 5071 vim_free(sub_firstline); /* free the copy of the original line */ 5063 5072 sub_firstline = NULL; 5064 5073 } -
src/ex_cmds.h
diff -Naur vim72.orig/src/ex_cmds.h vim72/src/ex_cmds.h
old new 278 278 EX(CMD_crewind, "crewind", ex_cc, 279 279 RANGE|NOTADR|COUNT|TRLBAR|BANG), 280 280 EX(CMD_cscope, "cscope", do_cscope, 281 EXTRA|NOTRLCOM| SBOXOK|XFILE),281 EXTRA|NOTRLCOM|XFILE), 282 282 EX(CMD_cstag, "cstag", do_cstag, 283 283 BANG|TRLBAR|WORD1), 284 284 EX(CMD_cunmap, "cunmap", ex_unmap, … … 506 506 EX(CMD_lclose, "lclose", ex_cclose, 507 507 RANGE|NOTADR|COUNT|TRLBAR), 508 508 EX(CMD_lcscope, "lcscope", do_cscope, 509 EXTRA|NOTRLCOM| SBOXOK|XFILE),509 EXTRA|NOTRLCOM|XFILE), 510 510 EX(CMD_left, "left", ex_align, 511 511 TRLBAR|RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY), 512 512 EX(CMD_leftabove, "leftabove", ex_wrongmodifier, … … 635 635 RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), 636 636 EX(CMD_noremap, "noremap", ex_map, 637 637 BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), 638 EX(CMD_noautocmd, "noautocmd", ex_wrongmodifier, 639 NEEDARG|EXTRA|NOTRLCOM), 638 640 EX(CMD_nohlsearch, "nohlsearch", ex_nohlsearch, 639 641 TRLBAR|SBOXOK|CMDWIN), 640 642 EX(CMD_noreabbrev, "noreabbrev", ex_abbreviate, … … 651 653 EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), 652 654 EX(CMD_open, "open", ex_open, 653 655 RANGE|EXTRA), 656 EX(CMD_oldfiles, "oldfiles", ex_oldfiles, 657 BANG|TRLBAR|SBOXOK|CMDWIN), 654 658 EX(CMD_omap, "omap", ex_map, 655 659 EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), 656 660 EX(CMD_omapclear, "omapclear", ex_mapclear, … … 802 806 EX(CMD_scriptencoding, "scriptencoding", ex_scriptencoding, 803 807 WORD1|TRLBAR|CMDWIN), 804 808 EX(CMD_scscope, "scscope", do_scscope, 805 EXTRA|NOTRLCOM |SBOXOK),809 EXTRA|NOTRLCOM), 806 810 EX(CMD_set, "set", ex_set, 807 811 TRLBAR|EXTRA|CMDWIN|SBOXOK), 808 812 EX(CMD_setfiletype, "setfiletype", ex_setfiletype, -
src/ex_docmd.c
diff -Naur vim72.orig/src/ex_docmd.c vim72/src/ex_docmd.c
old new 364 364 # define ex_function ex_ni 365 365 # define ex_delfunction ex_ni 366 366 # define ex_return ex_ni 367 # define ex_oldfiles ex_ni 367 368 #endif 368 369 static char_u *arg_all __ARGS((void)); 369 370 #ifdef FEAT_SESSION … … 1770 1771 } 1771 1772 if (checkforcmd(&ea.cmd, "browse", 3)) 1772 1773 { 1773 #ifdef FEAT_BROWSE 1774 #ifdef FEAT_BROWSE_CMD 1774 1775 cmdmod.browse = TRUE; 1775 1776 #endif 1776 1777 continue; … … 2978 2979 {"keepmarks", 3, FALSE}, 2979 2980 {"leftabove", 5, FALSE}, 2980 2981 {"lockmarks", 3, FALSE}, 2982 {"noautocmd", 3, FALSE}, 2981 2983 {"rightbelow", 6, FALSE}, 2982 2984 {"sandbox", 3, FALSE}, 2983 2985 {"silent", 3, FALSE}, … … 3608 3610 return set_context_in_autocmd(xp, arg, FALSE); 3609 3611 3610 3612 case CMD_doautocmd: 3613 case CMD_doautoall: 3611 3614 return set_context_in_autocmd(xp, arg, TRUE); 3612 3615 #endif 3613 3616 case CMD_set: … … 5479 5482 return OK; 5480 5483 } 5481 5484 5485 /* 5486 * ":command ..." 5487 */ 5482 5488 static void 5483 5489 ex_command(eap) 5484 5490 exarg_T *eap; … … 5910 5916 char_u *q; 5911 5917 5912 5918 char_u *start; 5913 char_u *end; 5919 char_u *end = NULL; 5920 char_u *ksp; 5914 5921 size_t len, totlen; 5915 5922 5916 5923 size_t split_len = 0; … … 5927 5934 5928 5935 /* 5929 5936 * Replace <> in the command by the arguments. 5937 * First round: "buf" is NULL, compute length, allocate "buf". 5938 * Second round: copy result into "buf". 5930 5939 */ 5931 5940 buf = NULL; 5932 5941 for (;;) 5933 5942 { 5934 p = cmd->uc_rep; 5935 q = buf; 5943 p = cmd->uc_rep; /* source */ 5944 q = buf; /* destinateion */ 5936 5945 totlen = 0; 5937 while ((start = vim_strchr(p, '<')) != NULL 5938 && (end = vim_strchr(start + 1, '>')) != NULL)5946 5947 for (;;) 5939 5948 { 5949 start = vim_strchr(p, '<'); 5950 if (start != NULL) 5951 end = vim_strchr(start + 1, '>'); 5952 if (buf != NULL) 5953 { 5954 ksp = vim_strchr(p, K_SPECIAL); 5955 if (ksp != NULL && (start == NULL || ksp < start || end == NULL) 5956 && ((ksp[1] == KS_SPECIAL && ksp[2] == KE_FILLER) 5957 # ifdef FEAT_GUI 5958 || (ksp[1] == KS_EXTRA && ksp[2] == (int)KE_CSI) 5959 # endif 5960 )) 5961 { 5962 /* K_SPECIAL han been put in the buffer as K_SPECIAL 5963 * KS_SPECIAL KE_FILLER, like for mappings, but 5964 * do_cmdline() doesn't handle that, so convert it back. 5965 * Also change K_SPECIAL KS_EXTRA KE_CSI into CSI. */ 5966 len = ksp - p; 5967 if (len > 0) 5968 { 5969 mch_memmove(q, p, len); 5970 q += len; 5971 } 5972 *q++ = ksp[1] == KS_SPECIAL ? K_SPECIAL : CSI; 5973 p = ksp + 3; 5974 continue; 5975 } 5976 } 5977 5978 /* break if there no <item> is found */ 5979 if (start == NULL || end == NULL) 5980 break; 5981 5940 5982 /* Include the '>' */ 5941 5983 ++end; 5942 5984 … … 8749 8791 else if (*dirnow != NUL 8750 8792 && (ssop_flags & SSOP_CURDIR) && globaldir != NULL) 8751 8793 { 8752 (void)mch_chdir((char *)globaldir);8753 8794 if (mch_chdir((char *)globaldir) == OK) 8795 shorten_fnames(TRUE); 8754 8796 } 8755 8797 8756 8798 failed |= (makeopens(fd, dirnow) == FAIL); … … 9506 9548 break; 9507 9549 } 9508 9550 s = src + 1; 9551 if (*s == '<') /* "#<99" uses v:oldfiles */ 9552 ++s; 9509 9553 i = (int)getdigits(&s); 9510 9554 *usedlen = (int)(s - src); /* length of what we expand */ 9511 9555 9512 buf = buflist_findnr(i); 9513 if (buf == NULL) 9556 if (src[1] == '<') 9514 9557 { 9515 *errormsg = (char_u *)_("E194: No alternate file name to substitute for '#'"); 9558 if (*usedlen < 2) 9559 { 9560 /* Should we give an error message for #<text? */ 9561 *usedlen = 1; 9562 return NULL; 9563 } 9564 #ifdef FEAT_EVAL 9565 result = list_find_str(get_vim_var_list(VV_OLDFILES), 9566 (long)i); 9567 if (result == NULL) 9568 { 9569 *errormsg = (char_u *)""; 9570 return NULL; 9571 } 9572 #else 9573 *errormsg = (char_u *)_("E809: #< is not available without the +eval feature"); 9516 9574 return NULL; 9575 #endif 9517 9576 } 9518 if (lnump != NULL) 9519 *lnump = ECMD_LAST; 9520 if (buf->b_fname == NULL) 9577 else 9521 9578 { 9522 result = (char_u *)""; 9523 valid = 0; /* Must have ":p:h" to be valid */ 9579 buf = buflist_findnr(i); 9580 if (buf == NULL) 9581 { 9582 *errormsg = (char_u *)_("E194: No alternate file name to substitute for '#'"); 9583 return NULL; 9584 } 9585 if (lnump != NULL) 9586 *lnump = ECMD_LAST; 9587 if (buf->b_fname == NULL) 9588 { 9589 result = (char_u *)""; 9590 valid = 0; /* Must have ":p:h" to be valid */ 9591 } 9592 else 9593 result = buf->b_fname; 9524 9594 } 9525 else9526 result = buf->b_fname;9527 9595 break; 9528 9596 9529 9597 #ifdef FEAT_SEARCHPATH … … 9541 9609 #ifdef FEAT_AUTOCMD 9542 9610 case SPEC_AFILE: /* file name for autocommand */ 9543 9611 result = autocmd_fname; 9612 if (result != NULL && !autocmd_fname_full) 9613 { 9614 /* Still need to turn the fname into a full path. It is 9615 * postponed to avoid a delay when <afile> is not used. */ 9616 autocmd_fname_full = TRUE; 9617 result = FullName_save(autocmd_fname, FALSE); 9618 vim_free(autocmd_fname); 9619 autocmd_fname = result; 9620 } 9544 9621 if (result == NULL) 9545 9622 { 9546 9623 *errormsg = (char_u *)_("E495: no autocommand file name to substitute for \"<afile>\""); … … 10067 10144 */ 10068 10145 if (put_line(fd, "let s:sx = expand(\"<sfile>:p:r\").\"x.vim\"") == FAIL 10069 10146 || put_line(fd, "if file_readable(s:sx)") == FAIL 10070 || put_line(fd, " exe \"source \" . s:sx") == FAIL10147 || put_line(fd, " exe \"source \" . fnameescape(s:sx)") == FAIL 10071 10148 || put_line(fd, "endif") == FAIL) 10072 10149 return FAIL; 10073 10150 … … 10689 10766 p_viminfo = (char_u *)"'100"; 10690 10767 if (eap->cmdidx == CMD_rviminfo) 10691 10768 { 10692 if (read_viminfo(eap->arg, TRUE, TRUE, eap->forceit) == FAIL) 10769 if (read_viminfo(eap->arg, VIF_WANT_INFO | VIF_WANT_MARKS 10770 | (eap->forceit ? VIF_FORCEIT : 0)) == FAIL) 10693 10771 EMSG(_("E195: Cannot open viminfo file for reading")); 10694 10772 } 10695 10773 else -
src/ex_getln.c
diff -Naur vim72.orig/src/ex_getln.c vim72/src/ex_getln.c
old new 31 31 int cmdattr; /* attributes for prompt */ 32 32 int overstrike; /* Typing mode on the command line. Shared by 33 33 getcmdline() and put_on_cmdline(). */ 34 expand_T *xpc; /* struct being used for expansion, xp_pattern 35 may point into cmdbuff */ 34 36 int xp_context; /* type of expansion */ 35 37 # ifdef FEAT_EVAL 36 38 char_u *xp_arg; /* user-defined expansion arg */ … … 38 40 # endif 39 41 }; 40 42 41 static struct cmdline_info ccline; /* current cmdline_info */ 43 /* The current cmdline_info. It is initialized in getcmdline() and after that 44 * used by other functions. When invoking getcmdline() recursively it needs 45 * to be saved with save_cmdline() and restored with restore_cmdline(). 46 * TODO: make it local to getcmdline() and pass it around. */ 47 static struct cmdline_info ccline; 42 48 43 49 static int cmd_showtail; /* Only show path tail in lists ? */ 44 50 … … 238 244 } 239 245 240 246 ExpandInit(&xpc); 247 ccline.xpc = &xpc; 241 248 242 249 #ifdef FEAT_RIGHTLEFT 243 250 if (curwin->w_p_rl && *curwin->w_p_rlc == 's' … … 408 415 #endif 409 416 410 417 /* 411 * <S-Tab> works like CTRL-P (unless 'wc' is <S-Tab>). 418 * When there are matching completions to select <S-Tab> works like 419 * CTRL-P (unless 'wc' is <S-Tab>). 412 420 */ 413 if (c != p_wc && c == K_S_TAB && xpc.xp_numfiles != -1)421 if (c != p_wc && c == K_S_TAB && xpc.xp_numfiles > 0) 414 422 c = Ctrl_P; 415 423 416 424 #ifdef FEAT_WILDMENU … … 1513 1521 int old_firstc; 1514 1522 1515 1523 vim_free(ccline.cmdbuff); 1524 xpc.xp_context = EXPAND_NOTHING; 1516 1525 if (hiscnt == hislen) 1517 1526 p = lookfor; /* back to the old one */ 1518 1527 else … … 1839 1848 #endif 1840 1849 1841 1850 ExpandCleanup(&xpc); 1851 ccline.xpc = NULL; 1842 1852 1843 1853 #ifdef FEAT_SEARCH_EXTRA 1844 1854 if (did_incsearch) … … 2508 2518 } 2509 2519 mch_memmove(ccline.cmdbuff, p, (size_t)ccline.cmdlen + 1); 2510 2520 vim_free(p); 2521 2522 if (ccline.xpc != NULL 2523 && ccline.xpc->xp_pattern != NULL 2524 && ccline.xpc->xp_context != EXPAND_NOTHING 2525 && ccline.xpc->xp_context != EXPAND_UNSUCCESSFUL) 2526 { 2527 int i = (int)(ccline.xpc->xp_pattern - p); 2528 2529 /* If xp_pattern points inside the old cmdbuff it needs to be adjusted 2530 * to point into the newly allocated memory. */ 2531 if (i >= 0 && i <= ccline.cmdlen) 2532 ccline.xpc->xp_pattern = ccline.cmdbuff + i; 2533 } 2534 2511 2535 return OK; 2512 2536 } 2513 2537 … … 2875 2899 prev_ccline = ccline; 2876 2900 ccline.cmdbuff = NULL; 2877 2901 ccline.cmdprompt = NULL; 2902 ccline.xpc = NULL; 2878 2903 } 2879 2904 2880 2905 /* … … 3582 3607 ExpandInit(xp) 3583 3608 expand_T *xp; 3584 3609 { 3610 xp->xp_pattern = NULL; 3585 3611 xp->xp_backslash = XP_BS_NONE; 3586 3612 #ifndef BACKSLASH_IN_FILENAME 3587 3613 xp->xp_shell = FALSE; … … 4871 4897 if (s == NULL) 4872 4898 return FAIL; 4873 4899 sprintf((char *)s, "%s/%s*.vim", dirname, pat); 4874 all = globpath(p_rtp, s );4900 all = globpath(p_rtp, s, 0); 4875 4901 vim_free(s); 4876 4902 if (all == NULL) 4877 4903 return FAIL; … … 4912 4938 * newlines. Returns NULL for an error or no matches. 4913 4939 */ 4914 4940 char_u * 4915 globpath(path, file )4941 globpath(path, file, expand_options) 4916 4942 char_u *path; 4917 4943 char_u *file; 4944 int expand_options; 4918 4945 { 4919 4946 expand_T xpc; 4920 4947 char_u *buf; … … 4943 4970 { 4944 4971 add_pathsep(buf); 4945 4972 STRCAT(buf, file); 4946 if (ExpandFromContext(&xpc, buf, &num_p, &p, WILD_SILENT) != FAIL4947 4973 if (ExpandFromContext(&xpc, buf, &num_p, &p, 4974 WILD_SILENT|expand_options) != FAIL && num_p > 0) 4948 4975 { 4949 ExpandEscape(&xpc, buf, num_p, p, WILD_SILENT );4976 ExpandEscape(&xpc, buf, num_p, p, WILD_SILENT|expand_options); 4950 4977 for (len = 0, i = 0; i < num_p; ++i) 4951 4978 len += (int)STRLEN(p[i]) + 1; 4952 4979 -
src/feature.h
diff -Naur vim72.orig/src/feature.h vim72/src/feature.h
old new 767 767 768 768 /* 769 769 * +browse ":browse" command. 770 * or just the ":browse" command modifier 770 771 */ 771 #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)) 772 # define FEAT_BROWSE 772 #if defined(FEAT_NORMAL) 773 # define FEAT_BROWSE_CMD 774 # 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) 775 # define FEAT_BROWSE 776 # endif 773 777 #endif 774 778 775 779 /* -
src/fileio.c
diff -Naur vim72.orig/src/fileio.c vim72/src/fileio.c
old new 932 932 else 933 933 { 934 934 if (eap != NULL && eap->force_ff != 0) 935 { 935 936 fileformat = get_fileformat_force(curbuf, eap); 937 try_unix = try_dos = try_mac = FALSE; 938 } 936 939 else if (curbuf->b_p_bin) 937 940 fileformat = EOL_UNIX; /* binary: use Unix format */ 938 941 else if (*p_ffs == NUL) … … 2211 2214 { 2212 2215 /* Use stderr for stdin, makes shell commands work. */ 2213 2216 close(0); 2214 dup(2);2217 ignored = dup(2); 2215 2218 } 2216 2219 #endif 2217 2220 … … 2341 2344 STRCAT(IObuff, _("[CR missing]")); 2342 2345 c = TRUE; 2343 2346 } 2344 if (ff_error == EOL_MAC)2345 {2346 STRCAT(IObuff, _("[NL found]"));2347 c = TRUE;2348 }2349 2347 if (split) 2350 2348 { 2351 2349 STRCAT(IObuff, _("[long lines split]")); … … 2711 2709 { 2712 2710 if (!curbuf->b_marks_read && get_viminfo_parameter('\'') > 0 2713 2711 && curbuf->b_ffname != NULL) 2714 read_viminfo(NULL, FALSE, TRUE, FALSE);2712 read_viminfo(NULL, VIF_WANT_MARKS); 2715 2713 2716 2714 /* Always set b_marks_read; needed when 'viminfo' is changed to include 2717 2715 * the ' parameter after opening a buffer. */ … … 3451 3449 { 3452 3450 # ifdef UNIX 3453 3451 # ifdef HAVE_FCHOWN 3454 fchown(fd, st_old.st_uid, st_old.st_gid);3452 ignored = fchown(fd, st_old.st_uid, st_old.st_gid); 3455 3453 # endif 3456 3454 if (mch_stat((char *)IObuff, &st) < 0 3457 3455 || st.st_uid != st_old.st_uid … … 4367 4365 || st.st_uid != st_old.st_uid 4368 4366 || st.st_gid != st_old.st_gid) 4369 4367 { 4370 fchown(fd, st_old.st_uid, st_old.st_gid);4368 ignored = fchown(fd, st_old.st_uid, st_old.st_gid); 4371 4369 if (perm >= 0) /* set permission again, may have changed */ 4372 4370 (void)mch_setperm(wfname, perm); 4373 4371 } … … 5550 5548 name = "ucs-4le"; /* FF FE 00 00 */ 5551 5549 len = 4; 5552 5550 } 5553 else if (flags == FIO_ALL || flags ==(FIO_UCS2 | FIO_ENDIAN_L))5551 else if (flags == (FIO_UCS2 | FIO_ENDIAN_L)) 5554 5552 name = "ucs-2le"; /* FF FE */ 5555 else if (flags == (FIO_UTF16 | FIO_ENDIAN_L)) 5553 else if (flags == FIO_ALL || flags == (FIO_UTF16 | FIO_ENDIAN_L)) 5554 /* utf-16le is preferred, it also works for ucs-2le text */ 5556 5555 name = "utf-16le"; /* FF FE */ 5557 5556 } 5558 5557 else if (p[0] == 0xfe && p[1] == 0xff … … 6031 6030 { 6032 6031 tbuf[FGETS_SIZE - 2] = NUL; 6033 6032 #ifdef USE_CR 6034 fgets_cr((char *)tbuf, FGETS_SIZE, fp);6033 ignoredp = fgets_cr((char *)tbuf, FGETS_SIZE, fp); 6035 6034 #else 6036 fgets((char *)tbuf, FGETS_SIZE, fp);6035 ignoredp = fgets((char *)tbuf, FGETS_SIZE, fp); 6037 6036 #endif 6038 6037 } while (tbuf[FGETS_SIZE - 2] != NUL && tbuf[FGETS_SIZE - 2] != '\n'); 6039 6038 } … … 6107 6106 #ifdef HAVE_ACL 6108 6107 vim_acl_T acl; /* ACL from original file */ 6109 6108 #endif 6109 #if defined(UNIX) || defined(CASE_INSENSITIVE_FILENAME) 6110 int use_tmp_file = FALSE; 6111 #endif 6110 6112 6111 6113 /* 6112 * When the names are identical, there is nothing to do. 6114 * When the names are identical, there is nothing to do. When they refer 6115 * to the same file (ignoring case and slash/backslash differences) but 6116 * the file name differs we need to go through a temp file. 6113 6117 */ 6114 6118 if (fnamecmp(from, to) == 0) 6115 return 0; 6119 { 6120 #ifdef CASE_INSENSITIVE_FILENAME 6121 if (STRCMP(gettail(from), gettail(to)) != 0) 6122 use_tmp_file = TRUE; 6123 else 6124 #endif 6125 return 0; 6126 } 6116 6127 6117 6128 /* 6118 6129 * Fail if the "from" file doesn't exist. Avoids that "to" is deleted. … … 6120 6131 if (mch_stat((char *)from, &st) < 0) 6121 6132 return -1; 6122 6133 6134 #ifdef UNIX 6135 { 6136 struct stat st_to; 6137 6138 /* It's possible for the source and destination to be the same file. 6139 * This happens when "from" and "to" differ in case and are on a FAT32 6140 * filesystem. In that case go through a temp file name. */ 6141 if (mch_stat((char *)to, &st_to) >= 0 6142 && st.st_dev == st_to.st_dev 6143 && st.st_ino == st_to.st_ino) 6144 use_tmp_file = TRUE; 6145 } 6146 #endif 6147 6148 #if defined(UNIX) || defined(CASE_INSENSITIVE_FILENAME) 6149 if (use_tmp_file) 6150 { 6151 char tempname[MAXPATHL + 1]; 6152 6153 /* 6154 * Find a name that doesn't exist and is in the same directory. 6155 * Rename "from" to "tempname" and then rename "tempname" to "to". 6156 */ 6157 if (STRLEN(from) >= MAXPATHL - 5) 6158 return -1; 6159 STRCPY(tempname, from); 6160 for (n = 123; n < 99999; ++n) 6161 { 6162 sprintf((char *)gettail((char_u *)tempname), "%d", n); 6163 if (mch_stat(tempname, &st) < 0) 6164 { 6165 if (mch_rename((char *)from, tempname) == 0) 6166 { 6167 if (mch_rename(tempname, (char *)to) == 0) 6168 return 0; 6169 /* Strange, the second step failed. Try moving the 6170 * file back and return failure. */ 6171 mch_rename(tempname, (char *)from); 6172 return -1; 6173 } 6174 /* If it fails for one temp name it will most likely fail 6175 * for any temp name, give up. */ 6176 return -1; 6177 } 6178 } 6179 return -1; 6180 } 6181 #endif 6182 6123 6183 /* 6124 6184 * Delete the "to" file, this is required on some systems to make the 6125 6185 * mch_rename() work, on other systems it makes sure that we don't have … … 8523 8583 char_u *save_sourcing_name; 8524 8584 linenr_T save_sourcing_lnum; 8525 8585 char_u *save_autocmd_fname; 8586 int save_autocmd_fname_full; 8526 8587 int save_autocmd_bufnr; 8527 8588 char_u *save_autocmd_match; 8528 8589 int save_autocmd_busy; … … 8601 8662 * Save the autocmd_* variables and info about the current buffer. 8602 8663 */ 8603 8664 save_autocmd_fname = autocmd_fname; 8665 save_autocmd_fname_full = autocmd_fname_full; 8604 8666 save_autocmd_bufnr = autocmd_bufnr; 8605 8667 save_autocmd_match = autocmd_match; 8606 8668 save_autocmd_busy = autocmd_busy; … … 8618 8680 if (fname != NULL && *fname != NUL) 8619 8681 autocmd_fname = fname; 8620 8682 else if (buf != NULL) 8621 autocmd_fname = buf->b_f name;8683 autocmd_fname = buf->b_ffname; 8622 8684 else 8623 8685 autocmd_fname = NULL; 8624 8686 } 8625 8687 else 8626 8688 autocmd_fname = fname_io; 8627 8689 if (autocmd_fname != NULL) 8628 autocmd_fname = FullName_save(autocmd_fname, FALSE); 8690 autocmd_fname = vim_strsave(autocmd_fname); 8691 autocmd_fname_full = FALSE; /* call FullName_save() later */ 8629 8692 8630 8693 /* 8631 8694 * Set the buffer number to be used for <abuf>. … … 8810 8873 sourcing_lnum = save_sourcing_lnum; 8811 8874 vim_free(autocmd_fname); 8812 8875 autocmd_fname = save_autocmd_fname; 8876 autocmd_fname_full = save_autocmd_fname_full; 8813 8877 autocmd_bufnr = save_autocmd_bufnr; 8814 8878 autocmd_match = save_autocmd_match; 8815 8879 #ifdef FEAT_EVAL … … 8918 8982 { 8919 8983 apc->curpat = NULL; 8920 8984 8921 /* only use a pattern when it has not been removed, has commands and8985 /* Only use a pattern when it has not been removed, has commands and 8922 8986 * the group matches. For buffer-local autocommands only check the 8923 8987 * buffer number. */ 8924 8988 if (ap->pat != NULL && ap->cmds != NULL … … 9104 9168 set_context_in_autocmd(xp, arg, doautocmd) 9105 9169 expand_T *xp; 9106 9170 char_u *arg; 9107 int doautocmd; /* TRUE for :doauto cmd, FALSE for :autocmd */9171 int doautocmd; /* TRUE for :doauto*, FALSE for :autocmd */ 9108 9172 { 9109 9173 char_u *p; 9110 9174 int group; -
src/fold.c
diff -Naur vim72.orig/src/fold.c vim72/src/fold.c
old new 48 48 static int foldFind __ARGS((garray_T *gap, linenr_T lnum, fold_T **fpp)); 49 49 static int foldLevelWin __ARGS((win_T *wp, linenr_T lnum)); 50 50 static void checkupdate __ARGS((win_T *wp)); 51 static void setFoldRepeat __ARGS((linenr_T lnum, long count, int open));51 static void setFoldRepeat __ARGS((linenr_T lnum, long count, int do_open)); 52 52 static linenr_T setManualFold __ARGS((linenr_T lnum, int opening, int recurse, int *donep)); 53 53 static linenr_T setManualFoldWin __ARGS((win_T *wp, linenr_T lnum, int opening, int recurse, int *donep)); 54 54 static void foldOpenNested __ARGS((fold_T *fpr)); … … 740 740 garray_T *found_ga; 741 741 fold_T *found_fp = NULL; 742 742 linenr_T found_off = 0; 743 int use_level = FALSE;743 int use_level; 744 744 int maybe_small = FALSE; 745 745 int level = 0; 746 746 linenr_T lnum = start; … … 757 757 gap = &curwin->w_folds; 758 758 found_ga = NULL; 759 759 lnum_off = 0; 760 use_level = FALSE; 760 761 for (;;) 761 762 { 762 763 if (!foldFind(gap, lnum - lnum_off, &fp)) … … 783 784 else 784 785 { 785 786 lnum = found_fp->fd_top + found_fp->fd_len + found_off; 786 did_one = TRUE;787 787 788 788 if (foldmethodIsManual(curwin)) 789 789 deleteFoldEntry(found_ga, 790 790 (int)(found_fp - (fold_T *)found_ga->ga_data), recursive); 791 791 else 792 792 { 793 if (f ound_fp->fd_top + found_off < first_lnum)794 first_lnum = found_fp->fd_top ;795 if (l num > last_lnum)793 if (first_lnum > found_fp->fd_top + found_off) 794 first_lnum = found_fp->fd_top + found_off; 795 if (last_lnum < lnum) 796 796 last_lnum = lnum; 797 parseMarker(curwin); 797 if (!did_one) 798 parseMarker(curwin); 798 799 deleteFoldMarkers(found_fp, recursive, found_off); 799 800 } 801 did_one = TRUE; 800 802 801 803 /* redraw window */ 802 804 changed_window_setting(); … … 811 813 redraw_curbuf_later(INVERTED); 812 814 #endif 813 815 } 816 else 817 /* Deleting markers may make cursor column invalid. */ 818 check_cursor_col(); 819 814 820 if (last_lnum > 0) 815 821 changed_lines(first_lnum, (colnr_T)0, last_lnum, 0L); 816 822 } … … 1241 1247 * Repeat "count" times. 1242 1248 */ 1243 1249 static void 1244 setFoldRepeat(lnum, count, open)1250 setFoldRepeat(lnum, count, do_open) 1245 1251 linenr_T lnum; 1246 1252 long count; 1247 int open;1253 int do_open; 1248 1254 { 1249 1255 int done; 1250 1256 long n; … … 1252 1258 for (n = 0; n < count; ++n) 1253 1259 { 1254 1260 done = DONE_NOTHING; 1255 (void)setManualFold(lnum, open, FALSE, &done);1261 (void)setManualFold(lnum, do_open, FALSE, &done); 1256 1262 if (!(done & DONE_ACTION)) 1257 1263 { 1258 1264 /* Only give an error message when no fold could be opened. */ -
src/getchar.c
diff -Naur vim72.orig/src/getchar.c vim72/src/getchar.c
old new 3816 3816 int len = 1; 3817 3817 3818 3818 if (msg_didout || msg_silent != 0) 3819 { 3819 3820 msg_putchar('\n'); 3821 if (got_int) /* 'q' typed at MORE prompt */ 3822 return; 3823 } 3820 3824 if ((mp->m_mode & (INSERT + CMDLINE)) == INSERT + CMDLINE) 3821 3825 msg_putchar('!'); /* :map! */ 3822 3826 else if (mp->m_mode & INSERT) … … 4702 4706 return FAIL; 4703 4707 if (mp->m_noremap != REMAP_YES && fprintf(fd, "nore") < 0) 4704 4708 return FAIL; 4705 if (fp rintf(fd, cmd) < 0)4709 if (fputs(cmd, fd) < 0) 4706 4710 return FAIL; 4707 4711 if (buf != NULL && fputs(" <buffer>", fd) < 0) 4708 4712 return FAIL; … … 4801 4805 } 4802 4806 if (IS_SPECIAL(c) || modifiers) /* special key */ 4803 4807 { 4804 if (fp rintf(fd, (char *)get_special_key_name(c, modifiers)) < 0)4808 if (fputs((char *)get_special_key_name(c, modifiers), fd) < 0) 4805 4809 return FAIL; 4806 4810 continue; 4807 4811 } -
src/globals.h
diff -Naur vim72.orig/src/globals.h vim72/src/globals.h
old new 1022 1022 #endif 1023 1023 #ifdef FEAT_AUTOCMD 1024 1024 EXTERN char_u *autocmd_fname INIT(= NULL); /* fname for <afile> on cmdline */ 1025 EXTERN int autocmd_fname_full; /* autocmd_fname is full path */ 1025 1026 EXTERN int autocmd_bufnr INIT(= 0); /* fnum for <abuf> on cmdline */ 1026 1027 EXTERN char_u *autocmd_match INIT(= NULL); /* name for <amatch> on cmdline */ 1027 1028 EXTERN int did_cursorhold INIT(= FALSE); /* set when CursorHold t'gerd */ … … 1339 1340 1340 1341 #ifdef FEAT_NETBEANS_INTG 1341 1342 EXTERN char *netbeansArg INIT(= NULL); /* the -nb[:host:port:passwd] arg */ 1342 EXTERN int netbeansCloseFile INIT(= 0); /* send killed if != 0 */1343 1343 EXTERN int netbeansFireChanges INIT(= 1); /* send buffer changes if != 0 */ 1344 1344 EXTERN int netbeansForcedQuit INIT(= 0);/* don't write modified files */ 1345 1345 EXTERN int netbeansReadFile INIT(= 1); /* OK to read from disk if != 0 */ … … 1548 1548 EXTERN time_t starttime; 1549 1549 1550 1550 /* 1551 * Some compilers warn for not using a return value, but in some situations we 1552 * can't do anything useful with the value. Assign to this variable to avoid 1553 * the warning. 1554 */ 1555 EXTERN int ignored; 1556 EXTERN char *ignoredp; 1557 1558 /* 1551 1559 * Optional Farsi support. Include it here, so EXTERN and INIT are defined. 1552 1560 */ 1553 1561 #ifdef FEAT_FKMAP -
src/gui_at_sb.c
diff -Naur vim72.orig/src/gui_at_sb.c vim72/src/gui_at_sb.c
old new 1078 1078 Cardinal *num_params; /* unused */ 1079 1079 { 1080 1080 ScrollbarWidget sbw = (ScrollbarWidget)w; 1081 /* Use a union to avoid a warning for the weird conversion from float to 1082 * XtPointer. Comes from Xaw/Scrollbar.c. */ 1083 union { 1084 XtPointer xtp; 1085 float xtf; 1086 } xtpf; 1081 1087 1082 1088 if (LookAhead(w, event)) 1083 1089 return; … … 1085 1091 /* thumbProc is not pretty, but is necessary for backwards 1086 1092 compatibility on those architectures for which it work{s,ed}; 1087 1093 the intent is to pass a (truncated) float by value. */ 1088 XtCallCallbacks(w, XtNthumbProc, *(XtPointer*)&sbw->scrollbar.top); 1094 xtpf.xtf = sbw->scrollbar.top; 1095 XtCallCallbacks(w, XtNthumbProc, xtpf.xtp); 1089 1096 XtCallCallbacks(w, XtNjumpProc, (XtPointer)&sbw->scrollbar.top); 1090 1097 } 1091 1098 -
src/gui.c
diff -Naur vim72.orig/src/gui.c vim72/src/gui.c
old new 139 139 /* The read returns when the child closes the pipe (or when 140 140 * the child dies for some reason). */ 141 141 close(pipefd[1]); 142 (void)read(pipefd[0], &dummy, (size_t)1);142 ignored = (int)read(pipefd[0], &dummy, (size_t)1); 143 143 close(pipefd[0]); 144 144 } 145 145 … … 3241 3241 i = Rows; 3242 3242 gui_update_tabline(); 3243 3243 Rows = i; 3244 need_set_size = RESIZE_VERT;3244 need_set_size |= RESIZE_VERT; 3245 3245 if (using_tabline) 3246 3246 fix_size = TRUE; 3247 3247 if (!gui_use_tabline()) … … 3275 3275 if (gui.which_scrollbars[i] != prev_which_scrollbars[i]) 3276 3276 { 3277 3277 if (i == SBAR_BOTTOM) 3278 need_set_size = RESIZE_VERT;3278 need_set_size |= RESIZE_VERT; 3279 3279 else 3280 need_set_size = RESIZE_HOR;3280 need_set_size |= RESIZE_HOR; 3281 3281 if (gui.which_scrollbars[i]) 3282 3282 fix_size = TRUE; 3283 3283 } … … 3297 3297 gui_mch_enable_menu(gui.menu_is_active); 3298 3298 Rows = i; 3299 3299 prev_menu_is_active = gui.menu_is_active; 3300 need_set_size = RESIZE_VERT;3300 need_set_size |= RESIZE_VERT; 3301 3301 if (gui.menu_is_active) 3302 3302 fix_size = TRUE; 3303 3303 } … … 3308 3308 { 3309 3309 gui_mch_show_toolbar(using_toolbar); 3310 3310 prev_toolbar = using_toolbar; 3311 need_set_size = RESIZE_VERT;3311 need_set_size |= RESIZE_VERT; 3312 3312 if (using_toolbar) 3313 3313 fix_size = TRUE; 3314 3314 } … … 3318 3318 { 3319 3319 gui_mch_enable_footer(using_footer); 3320 3320 prev_footer = using_footer; 3321 need_set_size = RESIZE_VERT;3321 need_set_size |= RESIZE_VERT; 3322 3322 if (using_footer) 3323 3323 fix_size = TRUE; 3324 3324 } … … 3330 3330 prev_tearoff = using_tearoff; 3331 3331 } 3332 3332 #endif 3333 if (need_set_size )3333 if (need_set_size != 0) 3334 3334 { 3335 3335 #ifdef FEAT_GUI_GTK 3336 long c = Columns; 3336 long prev_Columns = Columns; 3337 long prev_Rows = Rows; 3337 3338 #endif 3338 3339 /* Adjust the size of the window to make the text area keep the 3339 3340 * same size and to avoid that part of our window is off-screen … … 3349 3350 * If you remove this, please test this command for resizing 3350 3351 * effects (with optional left scrollbar): ":vsp|q|vsp|q|vsp|q". 3351 3352 * Don't do this while starting up though. 3352 * And don't change Rows, it may have be reduced intentionally3353 * when adding menu/toolbar/tabline. */3354 if (!gui.starting )3353 * Don't change Rows when adding menu/toolbar/tabline. 3354 * Don't change Columns when adding vertical toolbar. */ 3355 if (!gui.starting && need_set_size != (RESIZE_VERT | RESIZE_HOR)) 3355 3356 (void)char_avail(); 3356 Columns = c; 3357 if ((need_set_size & RESIZE_VERT) == 0) 3358 Rows = prev_Rows; 3359 if ((need_set_size & RESIZE_HOR) == 0) 3360 Columns = prev_Columns; 3357 3361 #endif 3358 3362 } 3359 3363 #ifdef FEAT_WINDOWS -
src/gui_gtk_x11.c
diff -Naur vim72.orig/src/gui_gtk_x11.c vim72/src/gui_gtk_x11.c
old new 4070 4070 4071 4071 if (mask & (XValue | YValue)) 4072 4072 { 4073 int w ,h;4074 gui_mch_get_screen_dimensions(&w , &h);4075 h += p_ghr + get_menu_tool_height();4076 w += get_menu_tool_width();4073 int ww, hh; 4074 gui_mch_get_screen_dimensions(&ww, &hh); 4075 hh += p_ghr + get_menu_tool_height(); 4076 ww += get_menu_tool_width(); 4077 4077 if (mask & XNegative) 4078 x += w - pixel_width;4078 x += ww - pixel_width; 4079 4079 if (mask & YNegative) 4080 y += h - pixel_height;4080 y += hh - pixel_height; 4081 4081 #ifdef HAVE_GTK2 4082 4082 gtk_window_move(GTK_WINDOW(gui.mainwin), x, y); 4083 4083 #else -
src/gui_x11.c
diff -Naur vim72.orig/src/gui_x11.c vim72/src/gui_x11.c
old new 2450 2450 *colorPtr = colortable[closest]; 2451 2451 } 2452 2452 2453 free(colortable);2453 vim_free(colortable); 2454 2454 return OK; 2455 2455 } 2456 2456 -
src/gui_xmdlg.c
diff -Naur vim72.orig/src/gui_xmdlg.c vim72/src/gui_xmdlg.c
old new 369 369 char buf[TEMP_BUF_SIZE]; 370 370 XmString items[MAX_ENTRIES_IN_LIST]; 371 371 int i; 372 int i ndex;372 int idx; 373 373 374 for (i ndex = (int)ENCODING; index < (int)NONE; ++index)375 count[i ndex] = 0;374 for (idx = (int)ENCODING; idx < (int)NONE; ++idx) 375 count[idx] = 0; 376 376 377 377 /* First we insert the wild char into every single list. */ 378 378 if (fix != ENCODING) … … 503 503 /* 504 504 * Now loop trough the remaining lists and set them up. 505 505 */ 506 for (i ndex = (int)NAME; index < (int)NONE; ++index)506 for (idx = (int)NAME; idx < (int)NONE; ++idx) 507 507 { 508 508 Widget w; 509 509 510 if (fix == (enum ListSpecifier)i ndex)510 if (fix == (enum ListSpecifier)idx) 511 511 continue; 512 512 513 switch ((enum ListSpecifier)i ndex)513 switch ((enum ListSpecifier)idx) 514 514 { 515 515 case NAME: 516 516 w = data->list[NAME]; … … 525 525 w = (Widget)0; /* for lint */ 526 526 } 527 527 528 for (i = 0; i < count[i ndex]; ++i)528 for (i = 0; i < count[idx]; ++i) 529 529 { 530 items[i] = XmStringCreateLocalized(list[i ndex][i]);531 XtFree(list[i ndex][i]);530 items[i] = XmStringCreateLocalized(list[idx][i]); 531 XtFree(list[idx][i]); 532 532 } 533 533 XmListDeleteAllItems(w); 534 XmListAddItems(w, items, count[i ndex], 1);535 if (data->sel[i ndex])534 XmListAddItems(w, items, count[idx], 1); 535 if (data->sel[idx]) 536 536 { 537 537 XmStringFree(items[0]); 538 items[0] = XmStringCreateLocalized(data->sel[i ndex]);538 items[0] = XmStringCreateLocalized(data->sel[idx]); 539 539 XmListSelectItem(w, items[0], False); 540 540 XmListSetBottomItem(w, items[0]); 541 541 } 542 for (i = 0; i < count[i ndex]; ++i)542 for (i = 0; i < count[idx]; ++i) 543 543 XmStringFree(items[i]); 544 544 } 545 545 } … … 695 695 int n; 696 696 XmString str; 697 697 Arg args[4]; 698 char * msg = _("no specific match");698 char *nomatch_msg = _("no specific match"); 699 699 700 700 n = 0; 701 str = XmStringCreateLocalized( msg);701 str = XmStringCreateLocalized(nomatch_msg); 702 702 XtSetArg(args[n], XmNlabelString, str); ++n; 703 703 XtSetValues(data->sample, args, n); 704 704 apply_fontlist(data->sample); 705 XmTextSetString(data->name, msg);705 XmTextSetString(data->name, nomatch_msg); 706 706 XmStringFree(str); 707 707 708 708 return False; … … 886 886 { 887 887 int i; 888 888 int max; 889 int i ndex = 0;889 int idx = 0; 890 890 int size; 891 char str[128];891 char buf[128]; 892 892 893 893 for (i = 0, max = 0; i < data->num; i++) 894 894 { 895 get_part(fn(data, i), 7, str);896 size = atoi( str);895 get_part(fn(data, i), 7, buf); 896 size = atoi(buf); 897 897 if ((size > max) && (size < MAX_DISPLAY_SIZE)) 898 898 { 899 i ndex = i;899 idx = i; 900 900 max = size; 901 901 } 902 902 } 903 strcpy(big_font, fn(data, i ndex));903 strcpy(big_font, fn(data, idx)); 904 904 } 905 905 data->old = XLoadQueryFont(XtDisplay(parent), big_font); 906 906 data->old_list = gui_motif_create_fontlist(data->old); … … 1217 1217 1218 1218 if (i != 0) 1219 1219 { 1220 char name [TEMP_BUF_SIZE];1221 char style [TEMP_BUF_SIZE];1222 char size [TEMP_BUF_SIZE];1223 char encoding [TEMP_BUF_SIZE];1220 char namebuf[TEMP_BUF_SIZE]; 1221 char stylebuf[TEMP_BUF_SIZE]; 1222 char sizebuf[TEMP_BUF_SIZE]; 1223 char encodingbuf[TEMP_BUF_SIZE]; 1224 1224 char *found; 1225 1225 1226 1226 found = names[0]; 1227 1227 1228 name_part(found, name );1229 style_part(found, style );1230 size_part(found, size , data->in_pixels);1231 encoding_part(found, encoding );1232 1233 if (strlen(name ) > 01234 && strlen(style ) > 01235 && strlen(size ) > 01236 && strlen(encoding ) > 0)1228 name_part(found, namebuf); 1229 style_part(found, stylebuf); 1230 size_part(found, sizebuf, data->in_pixels); 1231 encoding_part(found, encodingbuf); 1232 1233 if (strlen(namebuf) > 0 1234 && strlen(stylebuf) > 0 1235 && strlen(sizebuf) > 0 1236 && strlen(encodingbuf) > 0) 1237 1237 { 1238 data->sel[NAME] = XtNewString(name );1239 data->sel[STYLE] = XtNewString(style );1240 data->sel[SIZE] = XtNewString(size );1241 data->sel[ENCODING] = XtNewString(encoding );1238 data->sel[NAME] = XtNewString(namebuf); 1239 data->sel[STYLE] = XtNewString(stylebuf); 1240 data->sel[SIZE] = XtNewString(sizebuf); 1241 data->sel[ENCODING] = XtNewString(encodingbuf); 1242 1242 data->font_name = XtNewString(names[0]); 1243 1243 display_sample(data); 1244 1244 XmTextSetString(data->name, data->font_name); -
src/gui_xmebw.c
diff -Naur vim72.orig/src/gui_xmebw.c vim72/src/gui_xmebw.c
old new 1256 1256 } 1257 1257 else 1258 1258 { 1259 intadjust = 0;1259 adjust = 0; 1260 1260 1261 1261 #if !defined(LESSTIF_VERSION) && (XmVersion > 1002) 1262 1262 /* … … 1268 1268 { 1269 1269 case XmEXTERNAL_HIGHLIGHT: 1270 1270 adjust = (eb->primitive.highlight_thickness - 1271 (eb->pushbutton.default_button_shadow_thickness ?1272 Xm3D_ENHANCE_PIXEL : 0));1271 (eb->pushbutton.default_button_shadow_thickness 1272 ? Xm3D_ENHANCE_PIXEL : 0)); 1273 1273 break; 1274 1274 1275 1275 case XmINTERNAL_HIGHLIGHT: 1276 adjust = 0;1277 1276 break; 1278 1277 1279 1278 default: -
src/if_cscope.c
diff -Naur vim72.orig/src/if_cscope.c vim72/src/if_cscope.c
old new 74 74 { "add", cs_add, 75 75 N_("Add a new database"), "add file|dir [pre-path] [flags]", 0 }, 76 76 { "find", cs_find, 77 N_("Query for a pattern"), FIND_USAGE, 1 },77 N_("Query for a pattern"), "find c|d|e|f|g|i|s|t name", 1 }, 78 78 { "help", cs_help, 79 79 N_("Show this message"), "help", 0 }, 80 80 { "kill", cs_kill, … … 1177 1177 (void)MSG_PUTS(_("cscope commands:\n")); 1178 1178 while (cmdp->name != NULL) 1179 1179 { 1180 (void)smsg((char_u *)_("%-5s: %-30s (Usage: %s)"), 1181 cmdp->name, _(cmdp->help), cmdp->usage); 1180 char *help = _(cmdp->help); 1181 int space_cnt = 30 - vim_strsize((char_u *)help); 1182 1183 /* Use %*s rather than %30s to ensure proper alignment in utf-8 */ 1184 if (space_cnt < 0) 1185 space_cnt = 0; 1186 (void)smsg((char_u *)_("%-5s: %s%*s (Usage: %s)"), 1187 cmdp->name, 1188 help, space_cnt, " ", 1189 cmdp->usage); 1182 1190 if (strcmp(cmdp->name, "find") == 0) 1183 MSG_PUTS(FIND_HELP); 1191 MSG_PUTS(_("\n" 1192 " c: Find functions calling this function\n" 1193 " d: Find functions called by this function\n" 1194 " e: Find this egrep pattern\n" 1195 " f: Find this file\n" 1196 " g: Find this definition\n" 1197 " i: Find files #including this file\n" 1198 " s: Find this C symbol\n" 1199 " t: Find assignments to\n")); 1200 1184 1201 cmdp++; 1185 1202 } 1186 1203 -
src/if_cscope.h
diff -Naur vim72.orig/src/if_cscope.h vim72/src/if_cscope.h
old new 42 42 * f 7name Find this file 43 43 * i 8name Find files #including this file 44 44 */ 45 #define FIND_USAGE "find c|d|e|f|g|i|s|t name"46 #define FIND_HELP "\n\47 c: Find functions calling this function\n\48 d: Find functions called by this function\n\49 e: Find this egrep pattern\n\50 f: Find this file\n\51 g: Find this definition\n\52 i: Find files #including this file\n\53 s: Find this C symbol\n\54 t: Find assignments to\n"55 56 45 57 46 typedef struct { 58 47 char * name; -
src/if_perl.xs
diff -Naur vim72.orig/src/if_perl.xs vim72/src/if_perl.xs
old new 136 136 # define Perl_newXS_flags dll_Perl_newXS_flags 137 137 #endif 138 138 # define Perl_sv_free dll_Perl_sv_free 139 # if (PERL_REVISION == 5) && (PERL_VERSION >= 10) 140 # define Perl_sv_free2 dll_Perl_sv_free2 141 # endif 139 142 # define Perl_sv_isa dll_Perl_sv_isa 140 143 # define Perl_sv_magic dll_Perl_sv_magic 141 144 # define Perl_sv_setiv dll_Perl_sv_setiv … … 163 166 # define Perl_Isv_yes_ptr dll_Perl_Isv_yes_ptr 164 167 # define boot_DynaLoader dll_boot_DynaLoader 165 168 166 # define Perl_sys_init 3 dll_Perl_sys_init3169 # define Perl_sys_init dll_Perl_sys_init 167 170 # define Perl_sys_term dll_Perl_sys_term 168 171 # define Perl_ISv_ptr dll_Perl_ISv_ptr 169 172 # define Perl_Istack_max_ptr dll_Perl_Istack_max_ptr … … 268 271 static void (*boot_DynaLoader)_((pTHX_ CV*)); 269 272 270 273 #if (PERL_REVISION == 5) && (PERL_VERSION >= 10) 271 static void (*Perl_sys_init3)(int* argc, char*** argv, char*** env); 274 static void (*Perl_sv_free2)(pTHX_ SV*); 275 static void (*Perl_sys_init)(int* argc, char*** argv); 272 276 static void (*Perl_sys_term)(void); 273 277 static SV** (*Perl_ISv_ptr)(register PerlInterpreter*); 274 278 static SV*** (*Perl_Istack_max_ptr)(register PerlInterpreter*); … … 367 371 {"Perl_TXpv_ptr", (PERL_PROC*)&Perl_TXpv_ptr}, 368 372 {"Perl_Tna_ptr", (PERL_PROC*)&Perl_Tna_ptr}, 369 373 #else 370 {"Perl_sys_init3", (PERL_PROC*)&Perl_sys_init3}, 374 {"Perl_sv_free2", (PERL_PROC*)&Perl_sv_free2}, 375 {"Perl_sys_init", (PERL_PROC*)&Perl_sys_init}, 371 376 {"Perl_sys_term", (PERL_PROC*)&Perl_sys_term}, 372 377 {"Perl_ISv_ptr", (PERL_PROC*)&Perl_ISv_ptr}, 373 378 {"Perl_Istack_sp_ptr", (PERL_PROC*)&Perl_Istack_sp_ptr}, … … 455 460 static char *argv[] = { "", "-e", "" }; 456 461 457 462 #if (PERL_REVISION == 5) && (PERL_VERSION >= 10) 458 Perl_sys_init 3(&argc, (char***)&argv, NULL);463 Perl_sys_init(&argc, (char***)&argv); 459 464 #endif 460 465 perl_interp = perl_alloc(); 461 466 perl_construct(perl_interp); -
src/if_python.c
diff -Naur vim72.orig/src/if_python.c vim72/src/if_python.c
old new 531 531 if (PythonMod_Init()) 532 532 goto fail; 533 533 534 /* Remove the element from sys.path that was added because of our 535 * argv[0] value in PythonMod_Init(). Previously we used an empty 536 * string, but dependinding on the OS we then get an empty entry or 537 * the current directory in sys.path. */ 538 PyRun_SimpleString("import sys; sys.path = filter(lambda x: x != '/must>not&exist', sys.path)"); 539 534 540 /* the first python thread is vim's, release the lock */ 535 541 Python_SaveThread(); 536 542 … … 1145 1151 1146 1152 /* Check if we run into a recursive loop. The item must be in lookupDict 1147 1153 * then and we can use it again. */ 1148 sprintf(ptrBuf, PRINTF_DECIMAL_LONG_U, (long_u)our_tv); 1149 result = PyDict_GetItemString(lookupDict, ptrBuf); 1150 if (result != NULL) 1151 Py_INCREF(result); 1152 else if (our_tv->v_type == VAR_STRING) 1154 if ((our_tv->v_type == VAR_LIST && our_tv->vval.v_list != NULL) 1155 || (our_tv->v_type == VAR_DICT && our_tv->vval.v_dict != NULL)) 1156 { 1157 sprintf(ptrBuf, PRINTF_DECIMAL_LONG_U, 1158 our_tv->v_type == VAR_LIST ? (long_u)our_tv->vval.v_list 1159 : (long_u)our_tv->vval.v_dict); 1160 result = PyDict_GetItemString(lookupDict, ptrBuf); 1161 if (result != NULL) 1162 { 1163 Py_INCREF(result); 1164 return result; 1165 } 1166 } 1167 1168 if (our_tv->v_type == VAR_STRING) 1153 1169 { 1154 1170 result = Py_BuildValue("s", our_tv->vval.v_string); 1155 PyDict_SetItemString(lookupDict, ptrBuf, result);1156 1171 } 1157 1172 else if (our_tv->v_type == VAR_NUMBER) 1158 1173 { … … 1161 1176 /* For backwards compatibility numbers are stored as strings. */ 1162 1177 sprintf(buf, "%ld", (long)our_tv->vval.v_number); 1163 1178 result = Py_BuildValue("s", buf); 1164 PyDict_SetItemString(lookupDict, ptrBuf, result);1165 1179 } 1166 1180 # ifdef FEAT_FLOAT 1167 1181 else if (our_tv->v_type == VAR_FLOAT) … … 1170 1184 1171 1185 sprintf(buf, "%f", our_tv->vval.v_float); 1172 1186 result = Py_BuildValue("s", buf); 1173 PyDict_SetItemString(lookupDict, ptrBuf, result);1174 1187 } 1175 1188 # endif 1176 1189 else if (our_tv->v_type == VAR_LIST) … … 1179 1192 listitem_T *curr; 1180 1193 1181 1194 result = PyList_New(0); 1182 PyDict_SetItemString(lookupDict, ptrBuf, result);1183 1195 1184 1196 if (list != NULL) 1185 1197 { 1198 PyDict_SetItemString(lookupDict, ptrBuf, result); 1199 1186 1200 for (curr = list->lv_first; curr != NULL; curr = curr->li_next) 1187 1201 { 1188 1202 newObj = VimToPython(&curr->li_tv, depth + 1, lookupDict); … … 1194 1208 else if (our_tv->v_type == VAR_DICT) 1195 1209 { 1196 1210 result = PyDict_New(); 1197 PyDict_SetItemString(lookupDict, ptrBuf, result);1198 1211 1199 1212 if (our_tv->vval.v_dict != NULL) 1200 1213 { … … 1203 1216 hashitem_T *hi; 1204 1217 dictitem_T *di; 1205 1218 1219 PyDict_SetItemString(lookupDict, ptrBuf, result); 1220 1206 1221 for (hi = ht->ht_array; todo > 0; ++hi) 1207 1222 { 1208 1223 if (!HASHITEM_EMPTY(hi)) … … 2345 2360 { 2346 2361 PyObject *mod; 2347 2362 PyObject *dict; 2348 static char *(argv[2]) = {"", NULL}; 2363 /* The special value is removed from sys.path in Python_Init(). */ 2364 static char *(argv[2]) = {"/must>not&exist/foo", NULL}; 2349 2365 2350 2366 /* Fixups... */ 2351 2367 BufferType.ob_type = &PyType_Type; -
src/if_xcmdsrv.c
diff -Naur vim72.orig/src/if_xcmdsrv.c vim72/src/if_xcmdsrv.c
old new 736 736 + serverReply.ga_len; 737 737 e.id = w; 738 738 ga_init2(&e.strings, 1, 100); 739 m emcpy(p, &e, sizeof(e));739 mch_memmove(p, &e, sizeof(e)); 740 740 serverReply.ga_len++; 741 741 } 742 742 } … … 1018 1018 p++; 1019 1019 count = numItems - (p - regProp); 1020 1020 if (count > 0) 1021 m emcpy(entry, p, count);1021 mch_memmove(entry, p, count); 1022 1022 XChangeProperty(dpy, RootWindow(dpy, 0), registryProperty, XA_STRING, 1023 1023 8, PropModeReplace, regProp, 1024 1024 (int)(numItems - (p - entry))); … … 1072 1072 p++; 1073 1073 lastHalf = numItems - (p - regProp); 1074 1074 if (lastHalf > 0) 1075 m emcpy(entry, p, lastHalf);1075 mch_memmove(entry, p, lastHalf); 1076 1076 numItems = (entry - regProp) + lastHalf; 1077 1077 p = entry; 1078 1078 continue; -
src/macros.h
diff -Naur vim72.orig/src/macros.h vim72/src/macros.h
old new 127 127 #ifdef FEAT_LANGMAP 128 128 /* 129 129 * Adjust chars in a language according to 'langmap' option. 130 * NOTE that there is NO overhead if 'langmap' is not set; but even131 * when set we only have to do 2 ifs and an array lookup.130 * NOTE that there is no noticeable overhead if 'langmap' is not set. 131 * When set the overhead for characters < 256 is small. 132 132 * Don't apply 'langmap' if the character comes from the Stuff buffer. 133 133 * The do-while is just to ignore a ';' after the macro. 134 134 */ 135 # define LANGMAP_ADJUST(c, condition) do { \ 136 if (*p_langmap && (condition) && !KeyStuffed && (c) >= 0 && (c) < 256) \ 137 c = langmap_mapchar[c]; \ 135 # ifdef FEAT_MBYTE 136 # define LANGMAP_ADJUST(c, condition) \ 137 do { \ 138 if (*p_langmap && (condition) && !KeyStuffed && (c) >= 0) \ 139 { \ 140 if ((c) < 256) \ 141 c = langmap_mapchar[c]; \ 142 else \ 143 c = langmap_adjust_mb(c); \ 144 } \ 138 145 } while (0) 146 # else 147 # define LANGMAP_ADJUST(c, condition) \ 148 do { \ 149 if (*p_langmap && (condition) && !KeyStuffed && (c) >= 0 && (c) < 256) \ 150 c = langmap_mapchar[c]; \ 151 } while (0) 152 # endif 153 #else 154 # define LANGMAP_ADJUST(c, condition) /* nop */ 139 155 #endif 140 156 141 157 /* -
src/main.c
diff -Naur vim72.orig/src/main.c vim72/src/main.c
old new 645 645 646 646 #ifdef FEAT_VIMINFO 647 647 /* 648 * Read in registers, history etc, but not marks, from the viminfo file 648 * Read in registers, history etc, but not marks, from the viminfo file. 649 * This is where v:oldfiles gets filled. 649 650 */ 650 651 if (*p_viminfo != NUL) 651 652 { 652 read_viminfo(NULL, TRUE, FALSE, FALSE);653 read_viminfo(NULL, VIF_WANT_INFO | VIF_GET_OLDFILES); 653 654 TIME_MSG("reading viminfo"); 654 655 } 655 656 #endif … … 1457 1458 ++initstr; 1458 1459 } 1459 1460 1460 if (TOLOWER_ASC(initstr[0]) == 'g' || initstr[0] == 'k') 1461 /* "gvim" starts the GUI. Also accept "Gvim" for MS-Windows. */ 1462 if (TOLOWER_ASC(initstr[0]) == 'g') 1461 1463 { 1462 1464 main_start_gui(); 1463 1465 #ifdef FEAT_GUI … … 1508 1510 early_arg_scan(parmp) 1509 1511 mparm_T *parmp; 1510 1512 { 1511 #if defined(FEAT_XCLIPBOARD) || defined(FEAT_CLIENTSERVER) 1513 #if defined(FEAT_XCLIPBOARD) || defined(FEAT_CLIENTSERVER) \ 1514 || !defined(FEAT_NETBEANS_INTG) 1512 1515 int argc = parmp->argc; 1513 1516 char **argv = parmp->argv; 1514 1517 int i; … … 1580 1583 else if (STRICMP(argv[i], "--echo-wid") == 0) 1581 1584 echo_wid_arg = TRUE; 1582 1585 # endif 1586 # ifndef FEAT_NETBEANS_INTG 1587 else if (strncmp(argv[i], "-nb", (size_t)3) == 0) 1588 { 1589 mch_errmsg(_("'-nb' cannot be used: not enabled at compile time\n")); 1590 mch_exit(2); 1591 } 1592 # endif 1593 1583 1594 } 1584 1595 #endif 1585 1596 } … … 2361 2372 * Is there any other system that cannot do this? 2362 2373 */ 2363 2374 close(0); 2364 dup(2);2375 ignored = dup(2); 2365 2376 #endif 2366 2377 } 2367 2378 -
src/mark.c
diff -Naur vim72.orig/src/mark.c vim72/src/mark.c
old new 1627 1627 1628 1628 /* 1629 1629 * Handle marks in the viminfo file: 1630 * fp_out == NULL read marks for current buffer only 1631 * fp_out != NULL copy marks for buffers not in buffer list 1630 * fp_out != NULL: copy marks for buffers not in buffer list 1631 * fp_out == NULL && (flags & VIF_WANT_MARKS): read marks for curbuf only 1632 * fp_out == NULL && (flags & VIF_GET_OLDFILES | VIF_FORCEIT): fill v:oldfiles 1632 1633 */ 1633 1634 void 1634 copy_viminfo_marks(virp, fp_out, count, eof )1635 copy_viminfo_marks(virp, fp_out, count, eof, flags) 1635 1636 vir_T *virp; 1636 1637 FILE *fp_out; 1637 1638 int count; 1638 1639 int eof; 1640 int flags; 1639 1641 { 1640 1642 char_u *line = virp->vir_line; 1641 1643 buf_T *buf; … … 1647 1649 char_u *p; 1648 1650 char_u *name_buf; 1649 1651 pos_T pos; 1652 #ifdef FEAT_EVAL 1653 list_T *list = NULL; 1654 #endif 1650 1655 1651 1656 if ((name_buf = alloc(LSIZE)) == NULL) 1652 1657 return; 1653 1658 *name_buf = NUL; 1659 1660 #ifdef FEAT_EVAL 1661 if (fp_out == NULL && (flags & (VIF_GET_OLDFILES | VIF_FORCEIT))) 1662 { 1663 list = list_alloc(); 1664 if (list != NULL) 1665 set_vim_var_list(VV_OLDFILES, list); 1666 } 1667 #endif 1668 1654 1669 num_marked_files = get_viminfo_parameter('\''); 1655 1670 while (!eof && (count < num_marked_files || fp_out == NULL)) 1656 1671 { … … 1681 1696 p++; 1682 1697 *p = NUL; 1683 1698 1699 #ifdef FEAT_EVAL 1700 if (list != NULL) 1701 list_append_string(list, str, -1); 1702 #endif 1703 1684 1704 /* 1685 1705 * If fp_out == NULL, load marks for current buffer. 1686 1706 * If fp_out != NULL, copy marks for buffers not in buflist. … … 1688 1708 load_marks = copy_marks_out = FALSE; 1689 1709 if (fp_out == NULL) 1690 1710 { 1691 if ( curbuf->b_ffname != NULL)1711 if ((flags & VIF_WANT_MARKS) && curbuf->b_ffname != NULL) 1692 1712 { 1693 1713 if (*name_buf == NUL) /* only need to do this once */ 1694 1714 home_replace(NULL, curbuf->b_ffname, name_buf, LSIZE, TRUE); -
src/mbyte.c
diff -Naur vim72.orig/src/mbyte.c vim72/src/mbyte.c
old new 717 717 * where mblen() returns 0 for invalid character. 718 718 * Therefore, following condition includes 0. 719 719 */ 720 (void)mblen(NULL, 0); /* First reset the state. */720 ignored = mblen(NULL, 0); /* First reset the state. */ 721 721 if (mblen(buf, (size_t)1) <= 0) 722 722 n = 2; 723 723 else … … 2540 2540 return (int)(p - q); 2541 2541 } 2542 2542 2543 #if defined(FEAT_EVAL) || defined(PROTO)2544 2543 /* 2545 2544 * Copy a character from "*fp" to "*tp" and advance the pointers. 2546 2545 */ … … 2555 2554 *tp += l; 2556 2555 *fp += l; 2557 2556 } 2558 #endif2559 2557 2560 2558 /* 2561 2559 * Return the offset from "p" to the first byte of a character. When "p" is … … 3133 3131 else 3134 3132 s = p + 1; 3135 3133 } 3136 for (i = 0; s[i] != NUL && s + i < buf +sizeof(buf) - 1; ++i)3134 for (i = 0; s[i] != NUL && i < sizeof(buf) - 1; ++i) 3137 3135 { 3138 3136 if (s[i] == '_' || s[i] == '-') 3139 3137 buf[i] = '-'; … … 5280 5278 5281 5279 /*ARGSUSED*/ 5282 5280 static void 5283 preedit_start_cbproc(XIC xic, XPointer client_data, XPointer call_data)5281 preedit_start_cbproc(XIC thexic, XPointer client_data, XPointer call_data) 5284 5282 { 5285 5283 #ifdef XIM_DEBUG 5286 5284 xim_log("xim_decide_input_style()\n"); … … 5314 5312 5315 5313 /*ARGSUSED*/ 5316 5314 static void 5317 preedit_draw_cbproc(XIC xic, XPointer client_data, XPointer call_data)5315 preedit_draw_cbproc(XIC thexic, XPointer client_data, XPointer call_data) 5318 5316 { 5319 5317 XIMPreeditDrawCallbackStruct *draw_data; 5320 5318 XIMText *text; … … 5386 5384 draw_feedback = (char *)alloc(draw_data->chg_first 5387 5385 + text->length); 5388 5386 else 5389 draw_feedback = realloc(draw_feedback,5387 draw_feedback = vim_realloc(draw_feedback, 5390 5388 draw_data->chg_first + text->length); 5391 5389 if (draw_feedback != NULL) 5392 5390 { … … 5455 5453 5456 5454 /*ARGSUSED*/ 5457 5455 static void 5458 preedit_caret_cbproc(XIC xic, XPointer client_data, XPointer call_data)5456 preedit_caret_cbproc(XIC thexic, XPointer client_data, XPointer call_data) 5459 5457 { 5460 5458 #ifdef XIM_DEBUG 5461 5459 xim_log("preedit_caret_cbproc()\n"); … … 5464 5462 5465 5463 /*ARGSUSED*/ 5466 5464 static void 5467 preedit_done_cbproc(XIC xic, XPointer client_data, XPointer call_data)5465 preedit_done_cbproc(XIC thexic, XPointer client_data, XPointer call_data) 5468 5466 { 5469 5467 #ifdef XIM_DEBUG 5470 5468 xim_log("preedit_done_cbproc()\n"); -
src/menu.c
diff -Naur vim72.orig/src/menu.c vim72/src/menu.c
old new 1120 1120 parent = menu; 1121 1121 menu = menu->children; 1122 1122 } 1123 vim_free(path_name); 1123 1124 1124 1125 /* Now we have found the matching menu, and we list the mappings */ 1125 1126 /* Highlight title */ -
src/message.c
diff -Naur vim72.orig/src/message.c vim72/src/message.c
old new 976 976 } 977 977 } 978 978 else if (msg_scrolled > Rows - 2 979 && (c == 'j' || c == K_DOWN || c == 'd'))979 && (c == 'j' || c == K_DOWN || c == 'd' || c == 'f')) 980 980 c = K_IGNORE; 981 981 } 982 982 } while ((had_got_int && c == Ctrl_C) … … 2504 2504 break; 2505 2505 2506 2506 case 'u': /* Up half a page */ 2507 case K_PAGEUP:2508 2507 scroll = -(Rows / 2); 2509 2508 break; 2510 2509 … … 2513 2512 break; 2514 2513 2515 2514 case 'b': /* one page back */ 2515 case K_PAGEUP: 2516 2516 scroll = -(Rows - 1); 2517 2517 break; 2518 2518 2519 2519 case ' ': /* one extra page */ 2520 case 'f': 2520 2521 case K_PAGEDOWN: 2521 2522 case K_LEFTMOUSE: 2522 2523 scroll = Rows - 1; … … 3309 3310 { 3310 3311 c = gui_mch_dialog(type, title, message, buttons, dfltbutton, 3311 3312 textfield); 3312 msg_end_prompt(); 3313 /* avoid a hit-enter prompt without clearing the cmdline */ 3314 need_wait_return = FALSE; 3315 emsg_on_display = FALSE; 3316 cmdline_row = msg_row; 3313 3317 3314 3318 /* Flush output to avoid that further messages and redrawing is done 3315 3319 * in the wrong order. */ … … 4556 4560 remove_trailing_zeroes = TRUE; 4557 4561 } 4558 4562 4559 if (fmt_spec == 'f' && abs_f > 1.0e307) 4563 if (fmt_spec == 'f' && 4564 #ifdef VAX 4565 abs_f > 1.0e38 4566 #else 4567 abs_f > 1.0e307 4568 #endif 4569 ) 4560 4570 { 4561 4571 /* Avoid a buffer overflow */ 4562 4572 strcpy(tmp, "inf"); … … 4585 4595 if (remove_trailing_zeroes) 4586 4596 { 4587 4597 int i; 4588 char * p;4598 char *tp; 4589 4599 4590 4600 /* Using %g or %G: remove superfluous zeroes. */ 4591 4601 if (fmt_spec == 'f') 4592 p = tmp + str_arg_l - 1;4602 tp = tmp + str_arg_l - 1; 4593 4603 else 4594 4604 { 4595 p = (char *)vim_strchr((char_u *)tmp,4605 tp = (char *)vim_strchr((char_u *)tmp, 4596 4606 fmt_spec == 'e' ? 'e' : 'E'); 4597 if ( p != NULL)4607 if (tp != NULL) 4598 4608 { 4599 4609 /* Remove superfluous '+' and leading 4600 4610 * zeroes from the exponent. */ 4601 if ( p[1] == '+')4611 if (tp[1] == '+') 4602 4612 { 4603 4613 /* Change "1.0e+07" to "1.0e07" */ 4604 STRMOVE( p + 1,p + 2);4614 STRMOVE(tp + 1, tp + 2); 4605 4615 --str_arg_l; 4606 4616 } 4607 i = ( p[1] == '-') ? 2 : 1;4608 while ( p[i] == '0')4617 i = (tp[1] == '-') ? 2 : 1; 4618 while (tp[i] == '0') 4609 4619 { 4610 4620 /* Change "1.0e07" to "1.0e7" */ 4611 STRMOVE( p + i,p + i + 1);4621 STRMOVE(tp + i, tp + i + 1); 4612 4622 --str_arg_l; 4613 4623 } 4614 -- p;4624 --tp; 4615 4625 } 4616 4626 } 4617 4627 4618 if ( p != NULL && !precision_specified)4628 if (tp != NULL && !precision_specified) 4619 4629 /* Remove trailing zeroes, but keep the one 4620 4630 * just after a dot. */ 4621 while (p > tmp + 2 && *p == '0' && p[-1] != '.') 4631 while (tp > tmp + 2 && *tp == '0' 4632 && tp[-1] != '.') 4622 4633 { 4623 STRMOVE( p,p + 1);4624 -- p;4634 STRMOVE(tp, tp + 1); 4635 --tp; 4625 4636 --str_arg_l; 4626 4637 } 4627 4638 } 4628 4639 else 4629 4640 { 4630 char * p;4641 char *tp; 4631 4642 4632 4643 /* Be consistent: some printf("%e") use 1.0e+12 4633 4644 * and some 1.0e+012. Remove one zero in the last 4634 4645 * case. */ 4635 p = (char *)vim_strchr((char_u *)tmp,4646 tp = (char *)vim_strchr((char_u *)tmp, 4636 4647 fmt_spec == 'e' ? 'e' : 'E'); 4637 if ( p != NULL && (p[1] == '+' ||p[1] == '-')4638 && p[2] == '0'4639 && vim_isdigit( p[3])4640 && vim_isdigit( p[4]))4648 if (tp != NULL && (tp[1] == '+' || tp[1] == '-') 4649 && tp[2] == '0' 4650 && vim_isdigit(tp[3]) 4651 && vim_isdigit(tp[4])) 4641 4652 { 4642 STRMOVE( p + 2,p + 3);4653 STRMOVE(tp + 2, tp + 3); 4643 4654 --str_arg_l; 4644 4655 } 4645 4656 } -
src/misc1.c
diff -Naur vim72.orig/src/misc1.c vim72/src/misc1.c
old new 3245 3245 3246 3246 /* When using ":silent" assume that <CR> was entered. */ 3247 3247 if (mouse_used != NULL) 3248 MSG_PUTS(_("Type number or click with mouse (<Enter>cancels): "));3248 MSG_PUTS(_("Type number and <Enter> or click with mouse (empty cancels): ")); 3249 3249 else 3250 MSG_PUTS(_(" Choice number (<Enter>cancels): "));3250 MSG_PUTS(_("Type number and <Enter> (empty cancels): ")); 3251 3251 3252 3252 /* Set the state such that text can be selected/copied/pasted and we still 3253 3253 * get mouse events. */ -
src/misc2.c
diff -Naur vim72.orig/src/misc2.c vim72/src/misc2.c
old new 873 873 /* 3. check for available memory: call mch_avail_mem() */ 874 874 if (mch_avail_mem(TRUE) < KEEP_ROOM && !releasing) 875 875 { 876 vim_free((char *)p); /* System is low... no go! */876 free((char *)p); /* System is low... no go! */ 877 877 p = NULL; 878 878 } 879 879 else … … 1257 1257 return escaped_string; 1258 1258 } 1259 1259 1260 #if !defined(BACKSLASH_IN_FILENAME) || defined(FEAT_EVAL) || defined(PROTO)1261 1260 /* 1262 1261 * Return TRUE when 'shell' has "csh" in the tail. 1263 1262 */ … … 1266 1265 { 1267 1266 return (strstr((char *)gettail(p_sh), "csh") != NULL); 1268 1267 } 1269 #endif1270 1268 1271 #if defined(FEAT_EVAL) || defined(PROTO)1272 1269 /* 1273 1270 * Escape "string" for use as a shell argument with system(). 1274 1271 * This uses single quotes, except when we know we need to use double qoutes … … 1391 1388 1392 1389 return escaped_string; 1393 1390 } 1394 #endif1395 1391 1396 1392 /* 1397 1393 * Like vim_strsave(), but make all characters uppercase. … … 2565 2561 int key; 2566 2562 int dlen = 0; 2567 2563 2568 key = find_special_key(srcp, &modifiers, keycode );2564 key = find_special_key(srcp, &modifiers, keycode, FALSE); 2569 2565 if (key == 0) 2570 2566 return 0; 2571 2567 … … 2601 2597 * returns 0 if there is no match. 2602 2598 */ 2603 2599 int 2604 find_special_key(srcp, modp, keycode )2600 find_special_key(srcp, modp, keycode, keep_x_key) 2605 2601 char_u **srcp; 2606 2602 int *modp; 2607 int keycode; /* prefer key code, e.g. K_DEL instead of DEL */ 2603 int keycode; /* prefer key code, e.g. K_DEL instead of DEL */ 2604 int keep_x_key; /* don't translate xHome to Home key */ 2608 2605 { 2609 2606 char_u *last_dash; 2610 2607 char_u *end_of_name; … … 2672 2669 else 2673 2670 { 2674 2671 key = get_special_key_code(last_dash + 1); 2675 key = handle_x_keys(key); 2672 if (!keep_x_key) 2673 key = handle_x_keys(key); 2676 2674 } 2677 2675 2678 2676 /* … … 4698 4696 stackp->ffs_filearray_cur = i + 1; 4699 4697 ff_push(search_ctx, stackp); 4700 4698 4701 simplify_filename(file_path); 4699 if (!path_with_url(file_path)) 4700 simplify_filename(file_path); 4702 4701 if (mch_dirname(ff_expand_buffer, MAXPATHL) 4703 4702 == OK) 4704 4703 { -
src/move.c
diff -Naur vim72.orig/src/move.c vim72/src/move.c
old new 280 280 281 281 if (curwin->w_botline <= curbuf->b_ml.ml_line_count) 282 282 { 283 if (curwin->w_cursor.lnum < curwin->w_botline 284 && ((long)curwin->w_cursor.lnum 283 if (curwin->w_cursor.lnum < curwin->w_botline) 284 { 285 if (((long)curwin->w_cursor.lnum 285 286 >= (long)curwin->w_botline - p_so 286 287 #ifdef FEAT_FOLDING 287 288 || hasAnyFolding(curwin) 288 289 #endif 289 290 )) 290 {291 { 291 292 lineoff_T loff; 292 293 293 /* Cursor is above botline, check if there are 'scrolloff' 294 * window lines below the cursor. If not, need to scroll. */ 294 /* Cursor is (a few lines) above botline, check if there are 295 * 'scrolloff' window lines below the cursor. If not, need to 296 * scroll. */ 295 297 n = curwin->w_empty_rows; 296 298 loff.lnum = curwin->w_cursor.lnum; 297 299 #ifdef FEAT_FOLDING … … 317 319 if (n >= p_so) 318 320 /* sufficient context, no need to scroll */ 319 321 check_botline = FALSE; 322 } 323 else 324 /* sufficient context, no need to scroll */ 325 check_botline = FALSE; 320 326 } 321 327 if (check_botline) 322 328 { … … 509 515 /* Approximate the value of w_botline */ 510 516 wp->w_botline += lnum - wp->w_topline; 511 517 wp->w_topline = lnum; 518 #ifdef FEAT_AUTOCMD 519 wp->w_topline_was_set = TRUE; 520 #endif 512 521 #ifdef FEAT_DIFF 513 522 wp->w_topfill = 0; 514 523 #endif -
src/nbdebug.c
diff -Naur vim72.orig/src/nbdebug.c vim72/src/nbdebug.c
old new 33 33 u_int nb_dlevel = 0; /* nb_debug verbosity level */ 34 34 35 35 void nbdb(char *, ...); 36 void nbtrace(char *, ...);37 36 38 37 static int lookup(char *); 39 38 #ifdef USE_NB_ERRORHANDLER … … 100 99 } /* end nbdebug_log_init */ 101 100 102 101 103 104 105 void106 nbtrace(107 char *fmt,108 ...)109 {110 va_list ap;111 112 if (nb_debug!= NULL && (nb_dlevel & (NB_TRACE | NB_TRACE_VERBOSE))) {113 va_start(ap, fmt);114 vfprintf(nb_debug, fmt, ap);115 va_end(ap);116 fflush(nb_debug);117 }118 119 } /* end nbtrace */120 121 122 102 void 123 103 nbdbg( 124 104 char *fmt, … … 136 116 } /* end nbdbg */ 137 117 138 118 139 void140 nbprt(141 char *fmt,142 ...)143 {144 va_list ap;145 146 if (nb_debug != NULL && nb_dlevel & NB_PRINT) {147 va_start(ap, fmt);148 vfprintf(nb_debug, fmt, ap);149 va_end(ap);150 fflush(nb_debug);151 }152 153 } /* end nbprt */154 155 156 119 static int 157 120 lookup( 158 121 char *file) -
src/nbdebug.h
diff -Naur vim72.orig/src/nbdebug.h vim72/src/nbdebug.h
old new 43 43 44 44 45 45 void nbdbg(char *, ...); 46 void nbprt(char *, ...);47 void nbtrace(char *, ...);48 46 49 47 void nbdebug_wait __ARGS((u_int wait_flags, char *wait_var, u_int wait_secs)); 50 48 void nbdebug_log_init __ARGS((char *log_var, char *level_var)); … … 70 68 { 71 69 } 72 70 73 void74 nbprt(75 char *fmt,76 ...)77 {78 }79 80 void81 nbtrace(82 char *fmt,83 ...)84 {85 }86 87 71 #endif /* NBDEBUG */ 88 72 #endif /* NBDEBUG_H */ -
src/netbeans.c
diff -Naur vim72.orig/src/netbeans.c vim72/src/netbeans.c
old new 1043 1043 nbdebug(("EVT: %s", buf)); 1044 1044 /* nb_send(buf, "netbeans_end"); avoid "write failed" messages */ 1045 1045 if (sd >= 0) 1046 sock_write(sd, buf, (int)STRLEN(buf)); /* ignore errors */1046 ignored = sock_write(sd, buf, (int)STRLEN(buf)); 1047 1047 } 1048 1048 } 1049 1049 … … 1921 1921 vim_free(path); 1922 1922 if (bufp == NULL) 1923 1923 { 1924 1924 nbdebug((" File %s not found in setBufferNumber\n", args)); 1925 1925 EMSG2("E642: File %s not found in setBufferNumber", args); 1926 1926 return FAIL; 1927 1927 } … … 2277 2277 int serNum; 2278 2278 int localTypeNum; 2279 2279 int typeNum; 2280 # ifdef NBDEBUG2281 int len;2282 # endif2283 2280 pos_T *pos; 2284 2281 2285 2282 if (buf == NULL || buf->bufp == NULL) … … 2303 2300 pos = get_off_or_lnum(buf->bufp, &args); 2304 2301 2305 2302 cp = (char *)args; 2306 # ifdef NBDEBUG 2307 len = 2308 # endif 2309 strtol(cp, &cp, 10); 2303 ignored = (int)strtol(cp, &cp, 10); 2310 2304 args = (char_u *)cp; 2311 2305 # ifdef NBDEBUG 2312 if ( len!= -1)2306 if (ignored != -1) 2313 2307 { 2314 2308 nbdebug((" partial line annotation -- Not Yet Implemented!\n")); 2315 2309 } … … 2321 2315 } 2322 2316 if (pos) 2323 2317 { 2324 coloncmd(":sign place %d line=% d name=%d buffer=%d",2318 coloncmd(":sign place %d line=%ld name=%d buffer=%d", 2325 2319 serNum, pos->lnum, typeNum, buf->bufp->b_fnum); 2326 2320 if (typeNum == curPCtype) 2327 2321 coloncmd(":sign jump %d buffer=%d", serNum, … … 2425 2419 GUARDED) == 0) 2426 2420 { 2427 2421 coloncmd( 2428 ":sign place %d line=% d name=%d buffer=%d",2422 ":sign place %d line=%ld name=%d buffer=%d", 2429 2423 guardId++, lnum, GUARDED, 2430 2424 buf->bufp->b_fnum); 2431 2425 } … … 2924 2918 } 2925 2919 2926 2920 /* 2927 * Tell netbeans a file was closed.2921 * Tell netbeans that a file was deleted or wiped out. 2928 2922 */ 2929 2923 void 2930 netbeans_file_ closed(buf_T *bufp)2924 netbeans_file_killed(buf_T *bufp) 2931 2925 { 2932 2926 int bufno = nb_getbufno(bufp); 2933 2927 nbbuf_T *nbbuf = nb_get_buf(bufno); 2934 2928 char buffer[2*MAXPATHL]; 2935 2929 2936 if (!haveConnection || bufno < 0) 2937 return; 2938 2939 if (!netbeansCloseFile) 2940 { 2941 nbdebug(("Ignoring file_closed for %s. File was closed from IDE\n", 2942 bufp->b_ffname)); 2930 if (!haveConnection || bufno == -1) 2943 2931 return; 2944 }2945 2946 nbdebug(("netbeans_file_closed:\n"));2947 nbdebug((" Closing bufno: %d", bufno));2948 if (curbuf != NULL && curbuf != bufp)2949 {2950 nbdebug((" Curbuf bufno: %d\n", nb_getbufno(curbuf)));2951 }2952 else if (curbuf == bufp)2953 {2954 nbdebug((" curbuf == bufp\n"));2955 }2956 2932 2957 if (bufno <= 0)2958 return;2933 nbdebug(("netbeans_file_killed:\n")); 2934 nbdebug((" Killing bufno: %d", bufno)); 2959 2935 2960 2936 sprintf(buffer, "%d:killed=%d\n", bufno, r_cmdno); 2961 2937 2962 2938 nbdebug(("EVT: %s", buffer)); 2963 2939 2964 nb_send(buffer, "netbeans_file_ closed");2940 nb_send(buffer, "netbeans_file_killed"); 2965 2941 2966 2942 if (nbbuf != NULL) 2967 2943 nbbuf->bufp = NULL; -
src/normal.c
diff -Naur vim72.orig/src/normal.c vim72/src/normal.c
old new 183 183 static void nv_cursorhold __ARGS((cmdarg_T *cap)); 184 184 #endif 185 185 186 static char *e_noident = N_("E349: No identifier under cursor"); 187 186 188 /* 187 189 * Function to be called for a Normal or Visual mode command. 188 190 * The argument is a cmdarg_T. … … 578 580 static int old_mapped_len = 0; 579 581 #endif 580 582 int idx; 583 #ifdef FEAT_EVAL 584 int set_prevcount = FALSE; 585 #endif 581 586 582 587 vim_memset(&ca, 0, sizeof(ca)); /* also resets ca.retval */ 583 588 ca.oap = oap; … … 613 618 /* When not finishing an operator and no register name typed, reset the 614 619 * count. */ 615 620 if (!finish_op && !oap->regname) 621 { 616 622 ca.opcount = 0; 623 #ifdef FEAT_EVAL 624 set_prevcount = TRUE; 625 #endif 626 } 617 627 618 628 #ifdef FEAT_AUTOCMD 619 629 /* Restore counts from before receiving K_CURSORHOLD. This means after … … 641 651 * Get the command character from the user. 642 652 */ 643 653 c = safe_vgetc(); 644 645 #ifdef FEAT_LANGMAP646 654 LANGMAP_ADJUST(c, TRUE); 647 #endif648 655 649 656 #ifdef FEAT_VISUAL 650 657 /* … … 717 724 * command, so that v:count can be used in an expression mapping 718 725 * right after the count. */ 719 726 if (toplevel && stuff_empty()) 720 set_vcount(ca.count0, ca.count0 == 0 ? 1 : ca.count0); 727 { 728 long count = ca.count0; 729 730 /* multiply with ca.opcount the same way as below */ 731 if (ca.opcount != 0) 732 count = ca.opcount * (count == 0 ? 1 : count); 733 set_vcount(count, count == 0 ? 1 : count, set_prevcount); 734 set_prevcount = FALSE; /* only set v:prevcount once */ 735 } 721 736 #endif 722 737 if (ctrl_w) 723 738 { … … 726 741 } 727 742 ++no_zero_mapping; /* don't map zero here */ 728 743 c = plain_vgetc(); 729 #ifdef FEAT_LANGMAP730 744 LANGMAP_ADJUST(c, TRUE); 731 #endif732 745 --no_zero_mapping; 733 746 if (ctrl_w) 734 747 { … … 751 764 ++no_mapping; 752 765 ++allow_keys; /* no mapping for nchar, but keys */ 753 766 c = plain_vgetc(); /* get next character */ 754 #ifdef FEAT_LANGMAP755 767 LANGMAP_ADJUST(c, TRUE); 756 #endif757 768 --no_mapping; 758 769 --allow_keys; 759 770 #ifdef FEAT_CMDL_INFO … … 804 815 * Only set v:count when called from main() and not a stuffed command. 805 816 */ 806 817 if (toplevel && stuff_empty()) 807 set_vcount(ca.count0, ca.count1 );818 set_vcount(ca.count0, ca.count1, set_prevcount); 808 819 #endif 809 820 810 821 /* … … 941 952 * "gr", "g'" and "g`". 942 953 */ 943 954 ca.nchar = plain_vgetc(); 944 #ifdef FEAT_LANGMAP945 955 LANGMAP_ADJUST(ca.nchar, TRUE); 946 #endif947 956 #ifdef FEAT_CMDL_INFO 948 957 need_flushbuf |= add_to_showcmd(ca.nchar); 949 958 #endif … … 1044 1053 } 1045 1054 #endif 1046 1055 1047 #ifdef FEAT_LANGMAP1048 1056 /* adjust chars > 127, except after "tTfFr" commands */ 1049 1057 LANGMAP_ADJUST(*cp, !lang); 1050 #endif1051 1058 #ifdef FEAT_RIGHTLEFT 1052 1059 /* adjust Hebrew mapped char */ 1053 1060 if (p_hkmap && lang && KeyTyped) … … 1132 1139 out_flush(); 1133 1140 #endif 1134 1141 #ifdef FEAT_AUTOCMD 1135 did_cursorhold = FALSE; 1142 if (ca.cmdchar != K_IGNORE) 1143 did_cursorhold = FALSE; 1136 1144 #endif 1137 1145 1138 1146 State = NORMAL; … … 3509 3517 if (find_type & FIND_STRING) 3510 3518 EMSG(_("E348: No string under cursor")); 3511 3519 else 3512 EMSG(_( "E349: No identifier under cursor"));3520 EMSG(_(e_noident)); 3513 3521 return 0; 3514 3522 } 3515 3523 ptr += col; … … 4611 4619 ++no_mapping; 4612 4620 ++allow_keys; /* no mapping for nchar, but allow key codes */ 4613 4621 nchar = plain_vgetc(); 4614 #ifdef FEAT_LANGMAP4615 4622 LANGMAP_ADJUST(nchar, TRUE); 4616 #endif4617 4623 --no_mapping; 4618 4624 --allow_keys; 4619 4625 #ifdef FEAT_CMDL_INFO … … 4969 4975 ++no_mapping; 4970 4976 ++allow_keys; /* no mapping for nchar, but allow key codes */ 4971 4977 nchar = plain_vgetc(); 4972 #ifdef FEAT_LANGMAP4973 4978 LANGMAP_ADJUST(nchar, TRUE); 4974 #endif4975 4979 --no_mapping; 4976 4980 --allow_keys; 4977 4981 #ifdef FEAT_CMDL_INFO … … 5469 5473 STRCPY(buf, "he! "); 5470 5474 else 5471 5475 { 5476 /* An external command will probably use an argument starting 5477 * with "-" as an option. To avoid trouble we skip the "-". */ 5478 while (*ptr == '-' && n > 0) 5479 { 5480 ++ptr; 5481 --n; 5482 } 5483 if (n == 0) 5484 { 5485 EMSG(_(e_noident)); /* found dashes only */ 5486 vim_free(buf); 5487 return; 5488 } 5489 5472 5490 /* When a count is given, turn it into a range. Is this 5473 5491 * really what we want? */ 5474 5492 isman = (STRCMP(kp, "man") == 0); … … 5511 5529 /* 5512 5530 * Now grab the chars in the identifier 5513 5531 */ 5514 if (cmdchar == '*') 5515 aux_ptr = (char_u *)(p_magic ? "/.*~[^$\\" : "/^$\\"); 5516 else if (cmdchar == '#') 5517 aux_ptr = (char_u *)(p_magic ? "/?.*~[^$\\" : "/?^$\\"); 5518 else if (cmdchar == 'K' && !kp_help) 5519 aux_ptr = (char_u *)" \t\\\"|!"; 5520 else 5521 /* Don't escape spaces and Tabs in a tag with a backslash */ 5522 aux_ptr = (char_u *)"\\|\""; 5523 5524 p = buf + STRLEN(buf); 5525 while (n-- > 0) 5526 { 5527 /* put a backslash before \ and some others */ 5528 if (vim_strchr(aux_ptr, *ptr) != NULL) 5529 *p++ = '\\'; 5530 #ifdef FEAT_MBYTE 5531 /* When current byte is a part of multibyte character, copy all bytes 5532 * of that character. */ 5533 if (has_mbyte) 5532 if (cmdchar == 'K' && !kp_help) 5533 { 5534 /* Escape the argument properly for a shell command */ 5535 ptr = vim_strnsave(ptr, n); 5536 p = vim_strsave_shellescape(ptr, TRUE); 5537 vim_free(ptr); 5538 if (p == NULL) 5534 5539 { 5535 int i; 5536 int len = (*mb_ptr2len)(ptr) - 1; 5537 5538 for (i = 0; i < len && n >= 1; ++i, --n) 5539 *p++ = *ptr++; 5540 vim_free(buf); 5541 return; 5542 } 5543 buf = (char_u *)vim_realloc(buf, STRLEN(buf) + STRLEN(p) + 1); 5544 if (buf == NULL) 5545 { 5546 vim_free(buf); 5547 vim_free(p); 5548 return; 5540 5549 } 5550 STRCAT(buf, p); 5551 vim_free(p); 5552 } 5553 else 5554 { 5555 if (cmdchar == '*') 5556 aux_ptr = (char_u *)(p_magic ? "/.*~[^$\\" : "/^$\\"); 5557 else if (cmdchar == '#') 5558 aux_ptr = (char_u *)(p_magic ? "/?.*~[^$\\" : "/?^$\\"); 5559 else 5560 /* Don't escape spaces and Tabs in a tag with a backslash */ 5561 aux_ptr = (char_u *)"\\|\"\n*?["; 5562 5563 p = buf + STRLEN(buf); 5564 while (n-- > 0) 5565 { 5566 /* put a backslash before \ and some others */ 5567 if (vim_strchr(aux_ptr, *ptr) != NULL) 5568 *p++ = '\\'; 5569 #ifdef FEAT_MBYTE 5570 /* When current byte is a part of multibyte character, copy all 5571 * bytes of that character. */ 5572 if (has_mbyte) 5573 { 5574 int i; 5575 int len = (*mb_ptr2len)(ptr) - 1; 5576 5577 for (i = 0; i < len && n >= 1; ++i, --n) 5578 *p++ = *ptr++; 5579 } 5541 5580 #endif 5542 *p++ = *ptr++; 5581 *p++ = *ptr++; 5582 } 5583 *p = NUL; 5543 5584 } 5544 *p = NUL;5545 5585 5546 5586 /* 5547 5587 * Execute the command. … … 6728 6768 /* Visual mode "r" */ 6729 6769 if (VIsual_active) 6730 6770 { 6771 if (got_int) 6772 reset_VIsual(); 6731 6773 nv_operator(cap); 6732 6774 return; 6733 6775 } … … 7784 7826 else 7785 7827 i = curwin->w_leftcol; 7786 7828 /* Go to the middle of the screen line. When 'number' is on and lines 7787 * are wrapping the middle can be more to the left. */7829 * are wrapping the middle can be more to the left. */ 7788 7830 if (cap->nchar == 'm') 7789 7831 i += (W_WIDTH(curwin) - curwin_col_off() 7790 7832 + ((curwin->w_p_wrap && i > 0) -
src/ops.c
diff -Naur vim72.orig/src/ops.c vim72/src/ops.c
old new 2209 2209 { 2210 2210 for (; pos.lnum <= oap->end.lnum; ++pos.lnum) 2211 2211 { 2212 int one_change; 2213 2212 2214 block_prep(oap, &bd, pos.lnum, FALSE); 2213 2215 pos.col = bd.textcol; 2214 did_change = swapchars(oap->op_type, &pos, bd.textlen); 2216 one_change = swapchars(oap->op_type, &pos, bd.textlen); 2217 did_change |= one_change; 2215 2218 2216 2219 # ifdef FEAT_NETBEANS_INTG 2217 if (usingNetbeans && did_change)2220 if (usingNetbeans && one_change) 2218 2221 { 2219 2222 char_u *ptr = ml_get_buf(curbuf, pos.lnum, FALSE); 2220 2223 -
src/option.c
diff -Naur vim72.orig/src/option.c vim72/src/option.c
old new 2593 2593 #ifdef FEAT_VIMINFO 2594 2594 (char_u *)&p_viminfo, PV_NONE, 2595 2595 #if defined(MSDOS) || defined(MSWIN) || defined(OS2) 2596 {(char_u *)"", (char_u *)"' 20,<50,s10,h,rA:,rB:"}2596 {(char_u *)"", (char_u *)"'100,<50,s10,h,rA:,rB:"} 2597 2597 #else 2598 2598 # ifdef AMIGA 2599 2599 {(char_u *)"", 2600 (char_u *)"' 20,<50,s10,h,rdf0:,rdf1:,rdf2:"}2600 (char_u *)"'100,<50,s10,h,rdf0:,rdf1:,rdf2:"} 2601 2601 # else 2602 {(char_u *)"", (char_u *)"' 20,<50,s10,h"}2602 {(char_u *)"", (char_u *)"'100,<50,s10,h"} 2603 2603 # endif 2604 2604 #endif 2605 2605 #else … … 4119 4119 && options[opt_idx].var == VAR_WIN) 4120 4120 goto skip; 4121 4121 4122 /* Disallow changing some options from modelines */4123 if ( (opt_flags & OPT_MODELINE) && (flags & P_SECURE))4122 /* Disallow changing some options from modelines. */ 4123 if (opt_flags & OPT_MODELINE) 4124 4124 { 4125 errmsg = (char_u *)_("E520: Not allowed in a modeline"); 4126 goto skip; 4125 if (flags & P_SECURE) 4126 { 4127 errmsg = (char_u *)_("E520: Not allowed in a modeline"); 4128 goto skip; 4129 } 4130 #ifdef FEAT_DIFF 4131 /* In diff mode some options are overruled. This avoids that 4132 * 'foldmethod' becomes "marker" instead of "diff" and that 4133 * "wrap" gets set. */ 4134 if (curwin->w_p_diff 4135 && (options[opt_idx].indir == PV_FDM 4136 || options[opt_idx].indir == PV_WRAP)) 4137 goto skip; 4138 #endif 4127 4139 } 4128 4140 4129 4141 #ifdef HAVE_SANDBOX … … 5268 5280 } 5269 5281 #endif 5270 5282 5283 #ifdef FEAT_TITLE 5284 static void redraw_titles __ARGS((void)); 5285 5286 /* 5287 * Redraw the window title and/or tab page text later. 5288 */ 5289 static void redraw_titles() 5290 { 5291 need_maketitle = TRUE; 5292 # ifdef FEAT_WINDOWS 5293 redraw_tabline = TRUE; 5294 # endif 5295 } 5296 #endif 5297 5271 5298 /* 5272 5299 * Set a string option to a new value (without checking the effect). 5273 5300 * The string is copied into allocated memory. … … 5407 5434 int did_chartab = FALSE; 5408 5435 char_u **gvarp; 5409 5436 long_u free_oldval = (options[opt_idx].flags & P_ALLOCED); 5437 #ifdef FEAT_GUI 5438 /* set when changing an option that only requires a redraw in the GUI */ 5439 int redraw_gui_only = FALSE; 5440 #endif 5410 5441 5411 5442 /* Get the global option to compare with, otherwise we would have to check 5412 5443 * two values for all local options. */ … … 5668 5699 { 5669 5700 # ifdef FEAT_TITLE 5670 5701 /* May show a "+" in the title now. */ 5671 need_maketitle = TRUE;5702 redraw_titles(); 5672 5703 # endif 5673 5704 /* Add 'fileencoding' to the swap file. */ 5674 5705 ml_setflags(curbuf); … … 5687 5718 { 5688 5719 errmsg = mb_init(); 5689 5720 # ifdef FEAT_TITLE 5690 need_maketitle = TRUE;5721 redraw_titles(); 5691 5722 # endif 5692 5723 } 5693 5724 } … … 5796 5827 else 5797 5828 curbuf->b_p_tx = FALSE; 5798 5829 #ifdef FEAT_TITLE 5799 need_maketitle = TRUE;5830 redraw_titles(); 5800 5831 #endif 5801 5832 /* update flag in swap file */ 5802 5833 ml_setflags(curbuf); … … 6055 6086 errmsg = (char_u *)N_("E596: Invalid font(s)"); 6056 6087 } 6057 6088 } 6089 redraw_gui_only = TRUE; 6058 6090 } 6059 6091 # ifdef FEAT_XFONTSET 6060 6092 else if (varp == &p_guifontset) … … 6063 6095 errmsg = (char_u *)N_("E597: can't select fontset"); 6064 6096 else if (gui.in_use && gui_init_font(p_guifontset, TRUE) != OK) 6065 6097 errmsg = (char_u *)N_("E598: Invalid fontset"); 6098 redraw_gui_only = TRUE; 6066 6099 } 6067 6100 # endif 6068 6101 # ifdef FEAT_MBYTE … … 6072 6105 errmsg = (char_u *)N_("E533: can't select wide font"); 6073 6106 else if (gui_get_wide_font() == FAIL) 6074 6107 errmsg = (char_u *)N_("E534: Invalid wide font"); 6108 redraw_gui_only = TRUE; 6075 6109 } 6076 6110 # endif 6077 6111 #endif … … 6133 6167 #ifdef FEAT_GUI 6134 6168 /* 'guioptions' */ 6135 6169 else if (varp == &p_go) 6170 { 6136 6171 gui_init_which_components(oldval); 6172 redraw_gui_only = TRUE; 6173 } 6137 6174 #endif 6138 6175 6139 6176 #if defined(FEAT_GUI_TABLINE) 6140 6177 /* 'guitablabel' */ 6141 6178 else if (varp == &p_gtl) 6179 { 6142 6180 redraw_tabline = TRUE; 6181 redraw_gui_only = TRUE; 6182 } 6183 /* 'guitabtooltip' */ 6184 else if (varp == &p_gtt) 6185 { 6186 redraw_gui_only = TRUE; 6187 } 6143 6188 #endif 6144 6189 6145 6190 #if defined(FEAT_MOUSE_TTY) && (defined(UNIX) || defined(VMS)) … … 6717 6762 6718 6763 if (curwin->w_curswant != MAXCOL) 6719 6764 curwin->w_set_curswant = TRUE; /* in case 'showbreak' changed */ 6720 check_redraw(options[opt_idx].flags); 6765 #ifdef FEAT_GUI 6766 /* check redraw when it's not a GUI option or the GUI is active. */ 6767 if (!redraw_gui_only || gui.in_use) 6768 #endif 6769 check_redraw(options[opt_idx].flags); 6721 6770 6722 6771 return errmsg; 6723 6772 } … … 7105 7154 curbuf->b_did_warn = FALSE; 7106 7155 7107 7156 #ifdef FEAT_TITLE 7108 need_maketitle = TRUE;7157 redraw_titles(); 7109 7158 #endif 7110 7159 } 7111 7160 7112 7161 #ifdef FEAT_TITLE 7113 7162 /* when 'modifiable' is changed, redraw the window title */ 7114 7163 else if ((int *)varp == &curbuf->b_p_ma) 7115 need_maketitle = TRUE; 7164 { 7165 redraw_titles(); 7166 } 7116 7167 /* when 'endofline' is changed, redraw the window title */ 7117 7168 else if ((int *)varp == &curbuf->b_p_eol) 7118 need_maketitle = TRUE; 7119 #ifdef FEAT_MBYTE 7120 /* when 'bomb' is changed, redraw the window title */ 7169 { 7170 redraw_titles(); 7171 } 7172 # ifdef FEAT_MBYTE 7173 /* when 'bomb' is changed, redraw the window title and tab page text */ 7121 7174 else if ((int *)varp == &curbuf->b_p_bomb) 7122 need_maketitle = TRUE; 7123 #endif 7175 { 7176 redraw_titles(); 7177 } 7178 # endif 7124 7179 #endif 7125 7180 7126 7181 /* when 'bin' is set also set some other options */ … … 7128 7183 { 7129 7184 set_options_bin(old_value, curbuf->b_p_bin, opt_flags); 7130 7185 #ifdef FEAT_TITLE 7131 need_maketitle = TRUE;7186 redraw_titles(); 7132 7187 #endif 7133 7188 } 7134 7189 … … 7279 7334 if (!value) 7280 7335 save_file_ff(curbuf); /* Buffer is unchanged */ 7281 7336 #ifdef FEAT_TITLE 7282 need_maketitle = TRUE;7337 redraw_titles(); 7283 7338 #endif 7284 7339 #ifdef FEAT_AUTOCMD 7285 7340 modified_was_set = value; … … 7714 7769 newFoldLevel(); 7715 7770 } 7716 7771 7717 /* 'foldminl evel' */7772 /* 'foldminlines' */ 7718 7773 else if (pp == &curwin->w_p_fml) 7719 7774 { 7720 7775 foldUpdateAll(curwin); … … 7974 8029 else /* curwin->w_p_scr > curwin->w_height */ 7975 8030 curwin->w_p_scr = curwin->w_height; 7976 8031 } 8032 if (p_hi < 0) 8033 { 8034 errmsg = e_positive; 8035 p_hi = 0; 8036 } 7977 8037 if (p_report < 0) 7978 8038 { 7979 8039 errmsg = e_positive; … … 8227 8287 { 8228 8288 if (number == 0 && string != NULL) 8229 8289 { 8230 int i ndex;8290 int idx; 8231 8291 8232 8292 /* Either we are given a string or we are setting option 8233 8293 * to zero. */ 8234 for (i ndex = 0; string[index] == '0'; ++index)8294 for (idx = 0; string[idx] == '0'; ++idx) 8235 8295 ; 8236 if (string[i ndex] != NUL || index == 0)8296 if (string[idx] != NUL || idx == 0) 8237 8297 { 8238 8298 /* There's another character after zeros or the string 8239 8299 * is empty. In both cases, we are trying to set a … … 8323 8383 { 8324 8384 --arg; /* put arg at the '<' */ 8325 8385 modifiers = 0; 8326 key = find_special_key(&arg, &modifiers, TRUE );8386 key = find_special_key(&arg, &modifiers, TRUE, TRUE); 8327 8387 if (modifiers) /* can't handle modifiers here */ 8328 8388 key = 0; 8329 8389 } … … 10093 10153 10094 10154 #ifdef FEAT_LANGMAP 10095 10155 /* 10096 * Any character has an equivalent character. This is used for keyboards that 10097 * have a special language mode that sends characters above 128 (although 10098 * other characters can be translated too). 10156 * Any character has an equivalent 'langmap' character. This is used for 10157 * keyboards that have a special language mode that sends characters above 10158 * 128 (although other characters can be translated too). The "to" field is a 10159 * Vim command character. This avoids having to switch the keyboard back to 10160 * ASCII mode when leaving Insert mode. 10161 * 10162 * langmap_mapchar[] maps any of 256 chars to an ASCII char used for Vim 10163 * commands. 10164 * When FEAT_MBYTE is defined langmap_mapga.ga_data is a sorted table of 10165 * langmap_entry_T. This does the same as langmap_mapchar[] for characters >= 10166 * 256. 10167 */ 10168 # ifdef FEAT_MBYTE 10169 /* 10170 * With multi-byte support use growarray for 'langmap' chars >= 256 10099 10171 */ 10172 typedef struct 10173 { 10174 int from; 10175 int to; 10176 } langmap_entry_T; 10177 10178 static garray_T langmap_mapga; 10179 static void langmap_set_entry __ARGS((int from, int to)); 10100 10180 10101 10181 /* 10102 * char_u langmap_mapchar[256]; 10103 * Normally maps each of the 128 upper chars to an <128 ascii char; used to 10104 * "translate" native lang chars in normal mode or some cases of 10105 * insert mode without having to tediously switch lang mode back&forth. 10182 * Search for an entry in "langmap_mapga" for "from". If found set the "to" 10183 * field. If not found insert a new entry at the appropriate location. 10106 10184 */ 10185 static void 10186 langmap_set_entry(from, to) 10187 int from; 10188 int to; 10189 { 10190 langmap_entry_T *entries = (langmap_entry_T *)(langmap_mapga.ga_data); 10191 int a = 0; 10192 int b = langmap_mapga.ga_len; 10193 10194 /* Do a binary search for an existing entry. */ 10195 while (a != b) 10196 { 10197 int i = (a + b) / 2; 10198 int d = entries[i].from - from; 10199 10200 if (d == 0) 10201 { 10202 entries[i].to = to; 10203 return; 10204 } 10205 if (d < 0) 10206 a = i + 1; 10207 else 10208 b = i; 10209 } 10210 10211 if (ga_grow(&langmap_mapga, 1) != OK) 10212 return; /* out of memory */ 10213 10214 /* insert new entry at position "a" */ 10215 entries = (langmap_entry_T *)(langmap_mapga.ga_data) + a; 10216 mch_memmove(entries + 1, entries, 10217 (langmap_mapga.ga_len - a) * sizeof(langmap_entry_T)); 10218 ++langmap_mapga.ga_len; 10219 entries[0].from = from; 10220 entries[0].to = to; 10221 } 10222 10223 /* 10224 * Apply 'langmap' to multi-byte character "c" and return the result. 10225 */ 10226 int 10227 langmap_adjust_mb(c) 10228 int c; 10229 { 10230 langmap_entry_T *entries = (langmap_entry_T *)(langmap_mapga.ga_data); 10231 int a = 0; 10232 int b = langmap_mapga.ga_len; 10233 10234 while (a != b) 10235 { 10236 int i = (a + b) / 2; 10237 int d = entries[i].from - c; 10238 10239 if (d == 0) 10240 return entries[i].to; /* found matching entry */ 10241 if (d < 0) 10242 a = i + 1; 10243 else 10244 b = i; 10245 } 10246 return c; /* no entry found, return "c" unmodified */ 10247 } 10248 # endif 10107 10249 10108 10250 static void 10109 10251 langmap_init() 10110 10252 { 10111 10253 int i; 10112 10254 10113 for (i = 0; i < 256; i++) /* we init with a-one-to one map */ 10114 langmap_mapchar[i] = i; 10255 for (i = 0; i < 256; i++) 10256 langmap_mapchar[i] = i; /* we init with a one-to-one map */ 10257 # ifdef FEAT_MBYTE 10258 ga_init2(&langmap_mapga, sizeof(langmap_entry_T), 8); 10259 # endif 10115 10260 } 10116 10261 10117 10262 /* … … 10125 10270 char_u *p2; 10126 10271 int from, to; 10127 10272 10128 langmap_init(); /* back to one-to-one map first */ 10273 #ifdef FEAT_MBYTE 10274 ga_clear(&langmap_mapga); /* clear the previous map first */ 10275 #endif 10276 langmap_init(); /* back to one-to-one map */ 10129 10277 10130 10278 for (p = p_langmap; p[0] != NUL; ) 10131 10279 { … … 10175 10323 transchar(from)); 10176 10324 return; 10177 10325 } 10178 langmap_mapchar[from & 255] = to; 10326 10327 #ifdef FEAT_MBYTE 10328 if (from >= 256) 10329 langmap_set_entry(from, to); 10330 else 10331 #endif 10332 langmap_mapchar[from & 255] = to; 10179 10333 10180 10334 /* Advance to next pair */ 10181 10335 mb_ptr_adv(p); -
src/os_unix.c
diff -Naur vim72.orig/src/os_unix.c vim72/src/os_unix.c
old new 315 315 {-1, "Unknown!", FALSE} 316 316 }; 317 317 318 /* 319 * Write s[len] to the screen. 320 */ 318 321 void 319 322 mch_write(s, len) 320 323 char_u *s; 321 324 int len; 322 325 { 323 write(1, (char *)s, len);326 ignored = (int)write(1, (char *)s, len); 324 327 if (p_wd) /* Unix is too fast, slow down a bit more */ 325 328 RealWaitForChar(read_cmd_fd, p_wd, NULL); 326 329 } … … 2905 2908 * Ignore any errors. 2906 2909 */ 2907 2910 #if defined(HAVE_SIGALTSTACK) || defined(HAVE_SIGSTACK) 2908 signal_stack = malloc(SIGSTKSZ);2911 signal_stack = (char *)alloc(SIGSTKSZ); 2909 2912 init_signal_stack(); 2910 2913 #endif 2911 2914 } … … 2936 2939 } 2937 2940 # endif 2938 2941 # endif 2939 # ifdef FEAT_X11 2942 /* Don't close the display for GTK 1, it is done in exit(). */ 2943 # if defined(FEAT_X11) && (!defined(FEAT_GUI_GTK) || defined(HAVE_GTK2)) 2940 2944 if (x11_display != NULL 2941 2945 # ifdef FEAT_XCLIPBOARD 2942 2946 && x11_display != xterm_dpy … … 3926 3930 */ 3927 3931 if (fd >= 0) 3928 3932 { 3929 dup(fd); /* To replace stdin (file descriptor0) */3930 dup(fd); /* To replace stdout (file descriptor1) */3931 dup(fd); /* To replace stderr (file descriptor2) */3933 ignored = dup(fd); /* To replace stdin (fd 0) */ 3934 ignored = dup(fd); /* To replace stdout (fd 1) */ 3935 ignored = dup(fd); /* To replace stderr (fd 2) */ 3932 3936 3933 3937 /* Don't need this now that we've duplicated it */ 3934 3938 close(fd); … … 3946 3950 * children can be kill()ed. Don't do this when using pipes, 3947 3951 * because stdin is not a tty, we would lose /dev/tty. */ 3948 3952 if (p_stmp) 3953 { 3949 3954 (void)setsid(); 3955 # if defined(SIGHUP) 3956 /* When doing "!xterm&" and 'shell' is bash: the shell 3957 * will exit and send SIGHUP to all processes in its 3958 * group, killing the just started process. Ignore SIGHUP 3959 * to avoid that. (suggested by Simon Schubert) 3960 */ 3961 signal(SIGHUP, SIG_IGN); 3962 # endif 3963 } 3950 3964 # endif 3951 3965 # ifdef FEAT_GUI 3952 3966 if (pty_slave_fd >= 0) … … 3996 4010 3997 4011 /* set up stdin/stdout/stderr for the child */ 3998 4012 close(0); 3999 dup(pty_slave_fd);4013 ignored = dup(pty_slave_fd); 4000 4014 close(1); 4001 dup(pty_slave_fd);4015 ignored = dup(pty_slave_fd); 4002 4016 if (gui.in_use) 4003 4017 { 4004 4018 close(2); 4005 dup(pty_slave_fd);4019 ignored = dup(pty_slave_fd); 4006 4020 } 4007 4021 4008 4022 close(pty_slave_fd); /* has been dupped, close it now */ … … 4013 4027 /* set up stdin for the child */ 4014 4028 close(fd_toshell[1]); 4015 4029 close(0); 4016 dup(fd_toshell[0]);4030 ignored = dup(fd_toshell[0]); 4017 4031 close(fd_toshell[0]); 4018 4032 4019 4033 /* set up stdout for the child */ 4020 4034 close(fd_fromshell[0]); 4021 4035 close(1); 4022 dup(fd_fromshell[1]);4036 ignored = dup(fd_fromshell[1]); 4023 4037 close(fd_fromshell[1]); 4024 4038 4025 4039 # ifdef FEAT_GUI … … 4027 4041 { 4028 4042 /* set up stderr for the child */ 4029 4043 close(2); 4030 dup(1);4044 ignored = dup(1); 4031 4045 } 4032 4046 # endif 4033 4047 } … … 4078 4092 int fromshell_fd; 4079 4093 garray_T ga; 4080 4094 int noread_cnt; 4095 # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H) 4096 struct timeval start_tv; 4097 # endif 4081 4098 4082 4099 # ifdef FEAT_GUI 4083 4100 if (pty_master_fd >= 0) … … 4158 4175 && (lnum != 4159 4176 curbuf->b_ml.ml_line_count 4160 4177 || curbuf->b_p_eol))) 4161 write(toshell_fd, "\n", (size_t)1); 4178 ignored = write(toshell_fd, "\n", 4179 (size_t)1); 4162 4180 ++lnum; 4163 4181 if (lnum > curbuf->b_op_end.lnum) 4164 4182 { … … 4186 4204 ga_init2(&ga, 1, BUFLEN); 4187 4205 4188 4206 noread_cnt = 0; 4189 4207 # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H) 4208 gettimeofday(&start_tv, NULL); 4209 # endif 4190 4210 for (;;) 4191 4211 { 4192 4212 /* … … 4199 4219 * that a typed password is echoed for ssh or gpg command. 4200 4220 * Don't get characters when the child has already 4201 4221 * finished (wait_pid == 0). 4202 * Don't get extra characters when we already have one.4203 4222 * Don't read characters unless we didn't get output for a 4204 * while, avoids that ":r !ls" eats typeahead. 4223 * while (noread_cnt > 4), avoids that ":r !ls" eats 4224 * typeahead. 4205 4225 */ 4206 4226 len = 0; 4207 4227 if (!(options & SHELL_EXPAND) 4208 4228 && ((options & 4209 4229 (SHELL_READ|SHELL_WRITE|SHELL_COOKED)) 4210 4230 != (SHELL_READ|SHELL_WRITE|SHELL_COOKED) 4211 # ifdef FEAT_GUI4231 # ifdef FEAT_GUI 4212 4232 || gui.in_use 4213 # endif4233 # endif 4214 4234 ) 4215 4235 && wait_pid == 0 4216 && (ta_len > 0 4217 || (noread_cnt > 4 4218 && (len = ui_inchar(ta_buf, 4219 BUFLEN, 10L, 0)) > 0))) 4236 && (ta_len > 0 || noread_cnt > 4)) 4220 4237 { 4238 if (ta_len == 0) 4239 { 4240 /* Get extra characters when we don't have any. 4241 * Reset the counter and timer. */ 4242 noread_cnt = 0; 4243 # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H) 4244 gettimeofday(&start_tv, NULL); 4245 # endif 4246 len = ui_inchar(ta_buf, BUFLEN, 10L, 0); 4247 } 4248 if (ta_len > 0 || len > 0) 4249 { 4221 4250 /* 4222 4251 * For pipes: 4223 4252 * Check for CTRL-C: send interrupt signal to child. … … 4319 4348 { 4320 4349 ta_len -= len; 4321 4350 mch_memmove(ta_buf, ta_buf + len, ta_len); 4322 noread_cnt = 0;4323 4351 } 4324 4352 } 4353 } 4325 4354 } 4326 4355 4327 4356 if (got_int) … … 4429 4458 out_flush(); 4430 4459 if (got_int) 4431 4460 break; 4461 4462 # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H) 4463 { 4464 struct timeval now_tv; 4465 long msec; 4466 4467 /* Avoid that we keep looping here without 4468 * checking for a CTRL-C for a long time. Don't 4469 * break out too often to avoid losing typeahead. */ 4470 gettimeofday(&now_tv, NULL); 4471 msec = (now_tv.tv_sec - start_tv.tv_sec) * 1000L 4472 + (now_tv.tv_usec - start_tv.tv_usec) / 1000L; 4473 if (msec > 2000) 4474 { 4475 noread_cnt = 5; 4476 break; 4477 } 4478 } 4479 # endif 4432 4480 } 4433 4481 4434 4482 /* If we already detected the child has finished break the … … 6814 6862 if (xsmp_icefd != -1) 6815 6863 { 6816 6864 SmcCloseConnection(xsmp.smcconn, 0, NULL); 6817 vim_free(xsmp.clientid); 6865 if (xsmp.clientid != NULL) 6866 free(xsmp.clientid); 6818 6867 xsmp.clientid = NULL; 6819 6868 xsmp_icefd = -1; 6820 6869 } -
src/proto/eval.pro
diff -Naur vim72.orig/src/proto/eval.pro vim72/src/proto/eval.pro
old new 17 17 int eval_to_bool __ARGS((char_u *arg, int *error, char_u **nextcmd, int skip)); 18 18 char_u *eval_to_string_skip __ARGS((char_u *arg, char_u **nextcmd, int skip)); 19 19 int skip_expr __ARGS((char_u **pp)); 20 char_u *eval_to_string __ARGS((char_u *arg, char_u **nextcmd, int dolist));20 char_u *eval_to_string __ARGS((char_u *arg, char_u **nextcmd, int convert)); 21 21 char_u *eval_to_string_safe __ARGS((char_u *arg, char_u **nextcmd, int use_sandbox)); 22 22 int eval_to_number __ARGS((char_u *expr)); 23 23 list_T *eval_spell_expr __ARGS((char_u *badword, char_u *expr)); … … 46 46 void list_unref __ARGS((list_T *l)); 47 47 void list_free __ARGS((list_T *l, int recurse)); 48 48 dictitem_T *dict_lookup __ARGS((hashitem_T *hi)); 49 char_u *list_find_str __ARGS((list_T *l, long idx)); 49 50 int list_append_dict __ARGS((list_T *list, dict_T *dict)); 51 int list_append_string __ARGS((list_T *l, char_u *str, int len)); 50 52 int garbage_collect __ARGS((void)); 51 53 dict_T *dict_alloc __ARGS((void)); 52 54 int dict_add_nr_str __ARGS((dict_T *d, char *key, long nr, char_u *str)); … … 58 60 void set_vim_var_nr __ARGS((int idx, long val)); 59 61 long get_vim_var_nr __ARGS((int idx)); 60 62 char_u *get_vim_var_str __ARGS((int idx)); 61 void set_vcount __ARGS((long count, long count1)); 63 list_T *get_vim_var_list __ARGS((int idx)); 64 void set_vcount __ARGS((long count, long count1, int set_prevcount)); 62 65 void set_vim_var_string __ARGS((int idx, char_u *val, int len)); 66 void set_vim_var_list __ARGS((int idx, list_T *val)); 63 67 void set_reg_var __ARGS((int c)); 64 68 char_u *v_exception __ARGS((char_u *oldval)); 65 69 char_u *v_throwpoint __ARGS((char_u *oldval)); … … 94 98 void write_viminfo_varlist __ARGS((FILE *fp)); 95 99 int store_session_globals __ARGS((FILE *fd)); 96 100 void last_set_msg __ARGS((scid_T scriptID)); 101 void ex_oldfiles __ARGS((exarg_T *eap)); 97 102 int modify_fname __ARGS((char_u *src, int *usedlen, char_u **fnamep, char_u **bufp, int *fnamelen)); 98 103 char_u *do_string_sub __ARGS((char_u *str, char_u *pat, char_u *sub, char_u *flags)); 99 104 /* vim: set ft=c : */ -
src/proto/ex_cmds.pro
diff -Naur vim72.orig/src/proto/ex_cmds.pro vim72/src/proto/ex_cmds.pro
old new 11 11 char_u *make_filter_cmd __ARGS((char_u *cmd, char_u *itmp, char_u *otmp)); 12 12 void append_redir __ARGS((char_u *buf, char_u *opt, char_u *fname)); 13 13 int viminfo_error __ARGS((char *errnum, char *message, char_u *line)); 14 int read_viminfo __ARGS((char_u *file, int want_info, int want_marks, int forceit));14 int read_viminfo __ARGS((char_u *file, int flags)); 15 15 void write_viminfo __ARGS((char_u *file, int forceit)); 16 16 int viminfo_readline __ARGS((vir_T *virp)); 17 17 char_u *viminfo_readstring __ARGS((vir_T *virp, int off, int convert)); -
src/proto/ex_getln.pro
diff -Naur vim72.orig/src/proto/ex_getln.pro vim72/src/proto/ex_getln.pro
old new 31 31 void set_cmd_context __ARGS((expand_T *xp, char_u *str, int len, int col)); 32 32 int expand_cmdline __ARGS((expand_T *xp, char_u *str, int col, int *matchcount, char_u ***matches)); 33 33 int ExpandGeneric __ARGS((expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file, char_u *((*func)(expand_T *, int)))); 34 char_u *globpath __ARGS((char_u *path, char_u *file ));34 char_u *globpath __ARGS((char_u *path, char_u *file, int expand_options)); 35 35 void init_history __ARGS((void)); 36 36 int get_histtype __ARGS((char_u *name)); 37 37 void add_to_history __ARGS((int histype, char_u *new_entry, int in_map, int sep)); -
src/proto/mark.pro
diff -Naur vim72.orig/src/proto/mark.pro vim72/src/proto/mark.pro
old new 26 26 void write_viminfo_filemarks __ARGS((FILE *fp)); 27 27 int removable __ARGS((char_u *name)); 28 28 int write_viminfo_marks __ARGS((FILE *fp_out)); 29 void copy_viminfo_marks __ARGS((vir_T *virp, FILE *fp_out, int count, int eof ));29 void copy_viminfo_marks __ARGS((vir_T *virp, FILE *fp_out, int count, int eof, int flags)); 30 30 /* vim: set ft=c : */ -
src/proto/misc2.pro
diff -Naur vim72.orig/src/proto/misc2.pro vim72/src/proto/misc2.pro
old new 59 59 int handle_x_keys __ARGS((int key)); 60 60 char_u *get_special_key_name __ARGS((int c, int modifiers)); 61 61 int trans_special __ARGS((char_u **srcp, char_u *dst, int keycode)); 62 int find_special_key __ARGS((char_u **srcp, int *modp, int keycode ));62 int find_special_key __ARGS((char_u **srcp, int *modp, int keycode, int keep_x_key)); 63 63 int extract_modifiers __ARGS((int key, int *modp)); 64 64 int find_special_key_in_table __ARGS((int c)); 65 65 int get_special_key_code __ARGS((char_u *name)); -
src/proto/netbeans.pro
diff -Naur vim72.orig/src/proto/netbeans.pro vim72/src/proto/netbeans.pro
old new 11 11 void netbeans_frame_moved __ARGS((int new_x, int new_y)); 12 12 void netbeans_file_activated __ARGS((buf_T *bufp)); 13 13 void netbeans_file_opened __ARGS((buf_T *bufp)); 14 void netbeans_file_ closed __ARGS((buf_T *bufp));14 void netbeans_file_killed __ARGS((buf_T *bufp)); 15 15 void netbeans_inserted __ARGS((buf_T *bufp, linenr_T linenr, colnr_T col, char_u *txt, int newlen)); 16 16 void netbeans_removed __ARGS((buf_T *bufp, linenr_T linenr, colnr_T col, long len)); 17 17 void netbeans_unmodified __ARGS((buf_T *bufp)); -
src/proto/option.pro
diff -Naur vim72.orig/src/proto/option.pro vim72/src/proto/option.pro
old new 44 44 void set_context_in_set_cmd __ARGS((expand_T *xp, char_u *arg, int opt_flags)); 45 45 int ExpandSettings __ARGS((expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file)); 46 46 int ExpandOldSetting __ARGS((int *num_file, char_u ***file)); 47 int langmap_adjust_mb __ARGS((int c)); 47 48 int has_format_option __ARGS((int x)); 48 49 int shortmess __ARGS((int x)); 49 50 void vimrc_found __ARGS((char_u *fname, char_u *envname)); -
src/pty.c
diff -Naur vim72.orig/src/pty.c vim72/src/pty.c
old new 270 270 } 271 271 #endif 272 272 273 #if defined(HAVE_SVR4_PTYS) && !defined(PTY_DONE) && !defined(hpux) 273 #if defined(HAVE_SVR4_PTYS) && !defined(PTY_DONE) && !defined(hpux) && !defined(MACOS_X) 274 274 275 /* NOTE: Even though HPUX can have /dev/ptmx, the code below doesn't work! */ 275 /* NOTE: Even though HPUX can have /dev/ptmx, the code below doesn't work! 276 * Same for Mac OS X Leopard. */ 276 277 #define PTY_DONE 277 278 int 278 279 OpenPTY(ttyn) -
src/quickfix.c
diff -Naur vim72.orig/src/quickfix.c vim72/src/quickfix.c
old new 1419 1419 int opened_window = FALSE; 1420 1420 win_T *win; 1421 1421 win_T *altwin; 1422 int flags; 1422 1423 #endif 1423 1424 int print_message = TRUE; 1424 1425 int len; … … 1530 1531 if (qf_ptr->qf_type == 1 && (!curwin->w_buffer->b_help || cmdmod.tab != 0)) 1531 1532 { 1532 1533 win_T *wp; 1533 int n;1534 1534 1535 1535 if (cmdmod.tab != 0) 1536 1536 wp = NULL; … … 1546 1546 * Split off help window; put it at far top if no position 1547 1547 * specified, the current window is vertically split and narrow. 1548 1548 */ 1549 n= WSP_HELP;1549 flags = WSP_HELP; 1550 1550 # ifdef FEAT_VERTSPLIT 1551 1551 if (cmdmod.split == 0 && curwin->w_width != Columns 1552 1552 && curwin->w_width < 80) 1553 n|= WSP_TOP;1553 flags |= WSP_TOP; 1554 1554 # endif 1555 if (win_split(0, n) == FAIL) 1555 if (qi != &ql_info) 1556 flags |= WSP_NEWLOC; /* don't copy the location list */ 1557 1558 if (win_split(0, flags) == FAIL) 1556 1559 goto theend; 1557 1560 opened_window = TRUE; /* close it when fail */ 1558 1561 … … 1562 1565 if (qi != &ql_info) /* not a quickfix list */ 1563 1566 { 1564 1567 /* The new window should use the supplied location list */ 1565 qf_free_all(curwin);1566 1568 curwin->w_llist = qi; 1567 1569 qi->qf_refcount++; 1568 1570 } … … 1609 1611 { 1610 1612 goto_tabpage_win(tp, wp); 1611 1613 usable_win = 1; 1612 break;1614 goto win_found; 1613 1615 } 1614 1616 } 1615 1617 } 1618 win_found: 1616 1619 1617 1620 /* 1618 1621 * If there is only one window and it is the quickfix window, create a … … 1622 1625 { 1623 1626 ll_ref = curwin->w_llist_ref; 1624 1627 1625 if (win_split(0, WSP_ABOVE) == FAIL) 1628 flags = WSP_ABOVE; 1629 if (ll_ref != NULL) 1630 flags |= WSP_NEWLOC; 1631 if (win_split(0, flags) == FAIL) 1626 1632 goto failed; /* not enough room for window */ 1627 1633 opened_window = TRUE; /* close it when fail */ 1628 1634 p_swb = empty_option; /* don't split again */ … … 1634 1640 { 1635 1641 /* The new window should use the location list from the 1636 1642 * location list window */ 1637 qf_free_all(curwin);1638 1643 curwin->w_llist = ll_ref; 1639 1644 ll_ref->qf_refcount++; 1640 1645 } … … 2307 2312 if (eap->cmdidx == CMD_copen || eap->cmdidx == CMD_cwindow) 2308 2313 /* Create the new window at the very bottom. */ 2309 2314 win_goto(lastwin); 2310 if (win_split(height, WSP_BELOW ) == FAIL)2315 if (win_split(height, WSP_BELOW | WSP_NEWLOC) == FAIL) 2311 2316 return; /* not enough room for window */ 2312 2317 #ifdef FEAT_SCROLLBIND 2313 2318 curwin->w_p_scb = FALSE; 2314 2319 #endif 2315 2320 2316 /* Remove the location list for the quickfix window */2317 qf_free_all(curwin);2318 2319 2321 if (eap->cmdidx == CMD_lopen || eap->cmdidx == CMD_lwindow) 2320 2322 { 2321 2323 /* -
src/regexp.c
diff -Naur vim72.orig/src/regexp.c vim72/src/regexp.c
old new 4532 4532 cleanup_subexpr(); 4533 4533 if (!REG_MULTI) /* Single-line regexp */ 4534 4534 { 4535 if (reg_ endp[no] == NULL)4535 if (reg_startp[no] == NULL || reg_endp[no] == NULL) 4536 4536 { 4537 4537 /* Backref was not set: Match an empty string. */ 4538 4538 len = 0; … … 4548 4548 } 4549 4549 else /* Multi-line regexp */ 4550 4550 { 4551 if (reg_ endpos[no].lnum < 0)4551 if (reg_startpos[no].lnum < 0 || reg_endpos[no].lnum < 0) 4552 4552 { 4553 4553 /* Backref was not set: Match an empty string. */ 4554 4554 len = 0; … … 7279 7279 } 7280 7280 else 7281 7281 { 7282 if (submatch_match->endp[no] == NULL) 7282 s = submatch_match->startp[no]; 7283 if (s == NULL || submatch_match->endp[no] == NULL) 7283 7284 retval = NULL; 7284 7285 else 7285 {7286 s = submatch_match->startp[no];7287 7286 retval = vim_strnsave(s, (int)(submatch_match->endp[no] - s)); 7288 }7289 7287 } 7290 7288 7291 7289 return retval; -
src/screen.c
diff -Naur vim72.orig/src/screen.c vim72/src/screen.c
old new 2439 2439 2440 2440 #ifdef FEAT_SYN_HL 2441 2441 /* Show 'cursorcolumn' in the fold line. */ 2442 if (wp->w_p_cuc && (int)wp->w_virtcol + txtcol < W_WIDTH(wp)) 2443 ScreenAttrs[off + wp->w_virtcol + txtcol] = hl_combine_attr( 2444 ScreenAttrs[off + wp->w_virtcol + txtcol], hl_attr(HLF_CUC)); 2442 if (wp->w_p_cuc) 2443 { 2444 txtcol += wp->w_virtcol; 2445 if (wp->w_p_wrap) 2446 txtcol -= wp->w_skipcol; 2447 else 2448 txtcol -= wp->w_leftcol; 2449 if (txtcol >= 0 && txtcol < W_WIDTH(wp)) 2450 ScreenAttrs[off + txtcol] = hl_combine_attr( 2451 ScreenAttrs[off + txtcol], hl_attr(HLF_CUC)); 2452 } 2445 2453 #endif 2446 2454 2447 2455 SCREEN_LINE(row + W_WINROW(wp), W_WINCOL(wp), (int)W_WIDTH(wp), … … 2588 2596 int noinvcur = FALSE; /* don't invert the cursor */ 2589 2597 #ifdef FEAT_VISUAL 2590 2598 pos_T *top, *bot; 2599 int lnum_in_visual_area = FALSE; 2591 2600 #endif 2592 2601 pos_T pos; 2593 2602 long v; … … 2784 2793 top = &VIsual; 2785 2794 bot = &curwin->w_cursor; 2786 2795 } 2796 lnum_in_visual_area = (lnum >= top->lnum && lnum <= bot->lnum); 2787 2797 if (VIsual_mode == Ctrl_V) /* block mode */ 2788 2798 { 2789 if (lnum >= top->lnum && lnum <= bot->lnum)2799 if (lnum_in_visual_area) 2790 2800 { 2791 2801 fromcol = wp->w_old_cursor_fcol; 2792 2802 tocol = wp->w_old_cursor_lcol; … … 3412 3422 && (*mb_ptr2cells)(ptr) > 1) 3413 3423 #endif 3414 3424 || ((int)vcol_prev == fromcol_prev 3425 && vcol_prev < vcol /* not at margin */ 3415 3426 && vcol < tocol)) 3416 3427 area_attr = attr; /* start highlighting */ 3417 3428 else if (area_attr != 0 … … 4549 4560 * highlight the cursor position itself. */ 4550 4561 if (wp->w_p_cuc && vcol == (long)wp->w_virtcol 4551 4562 && lnum != wp->w_cursor.lnum 4552 && draw_state == WL_LINE) 4563 && draw_state == WL_LINE 4564 && !lnum_in_visual_area) 4553 4565 { 4554 4566 vcol_save_attr = char_attr; 4555 4567 char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUC)); … … 6350 6362 && c == 0x8e 6351 6363 && ScreenLines2[off] != ptr[1]) 6352 6364 || (enc_utf8 6353 && (ScreenLinesUC[off] != (u8char_T) u8c6365 && (ScreenLinesUC[off] != (u8char_T)(c >= 0x80 ? u8c : 0) 6354 6366 || screen_comp_differs(off, u8cc))) 6355 6367 #endif 6356 6368 || ScreenAttrs[off] != attr … … 7356 7368 #endif 7357 7369 static int entered = FALSE; /* avoid recursiveness */ 7358 7370 static int done_outofmem_msg = FALSE; /* did outofmem message */ 7371 #ifdef FEAT_AUTOCMD 7372 int retry_count = 0; 7359 7373 7374 retry: 7375 #endif 7360 7376 /* 7361 7377 * Allocation of the screen buffers is done only when the size changes and 7362 7378 * when Rows and Columns have been set and we have started doing full … … 7440 7456 { 7441 7457 outofmem = TRUE; 7442 7458 #ifdef FEAT_WINDOWS 7443 break;7459 goto give_up; 7444 7460 #endif 7445 7461 } 7446 7462 } 7463 #ifdef FEAT_WINDOWS 7464 give_up: 7465 #endif 7447 7466 7448 7467 #ifdef FEAT_MBYTE 7449 7468 for (i = 0; i < p_mco; ++i) … … 7628 7647 --RedrawingDisabled; 7629 7648 7630 7649 #ifdef FEAT_AUTOCMD 7631 if (starting == 0) 7650 /* 7651 * Do not apply autocommands more than 3 times to avoid an endless loop 7652 * in case applying autocommands always changes Rows or Columns. 7653 */ 7654 if (starting == 0 && ++retry_count <= 3) 7655 { 7632 7656 apply_autocmds(EVENT_VIMRESIZED, NULL, NULL, FALSE, curbuf); 7657 /* In rare cases, autocommands may have altered Rows or Columns, 7658 * jump back to check if we need to allocate the screen again. */ 7659 goto retry; 7660 } 7633 7661 #endif 7634 7662 } 7635 7663 -
src/spell.c
diff -Naur vim72.orig/src/spell.c vim72/src/spell.c
old new 77 77 78 78 /* 79 79 * Do the opposite: based on a maximum end score and a known sound score, 80 * compute the themaximum word score that can be used.80 * compute the maximum word score that can be used. 81 81 */ 82 82 #define MAXSCORE(word_score, sound_score) ((4 * word_score - sound_score) / 3) 83 83 … … 469 469 garray_T sl_comppat; /* CHECKCOMPOUNDPATTERN items */ 470 470 regprog_T *sl_compprog; /* COMPOUNDRULE turned into a regexp progrm 471 471 * (NULL when no compounding) */ 472 char_u *sl_comprules; /* all COMPOUNDRULE concatenated (or NULL) */ 472 473 char_u *sl_compstartflags; /* flags for first compound word */ 473 474 char_u *sl_compallflags; /* all flags for compound words */ 474 475 char_u sl_nobreak; /* When TRUE: no spaces between words */ … … 625 626 /* TRUE if a word appears in the list of banned words. */ 626 627 #define WAS_BANNED(su, word) (!HASHITEM_EMPTY(hash_find(&su->su_banned, word))) 627 628 628 /* Number of suggestions kept when cleaning up. we need to keep more than629 /* Number of suggestions kept when cleaning up. We need to keep more than 629 630 * what is displayed, because when rescore_suggestions() is called the score 630 631 * may change and wrong suggestions may be removed later. */ 631 632 #define SUG_CLEAN_COUNT(su) ((su)->su_maxcount < 130 ? 150 : (su)->su_maxcount + 20) … … 839 840 static void slang_clear __ARGS((slang_T *lp)); 840 841 static void slang_clear_sug __ARGS((slang_T *lp)); 841 842 static void find_word __ARGS((matchinf_T *mip, int mode)); 843 static int match_checkcompoundpattern __ARGS((char_u *ptr, int wlen, garray_T *gap)); 842 844 static int can_compound __ARGS((slang_T *slang, char_u *word, char_u *flags)); 845 static int can_be_compound __ARGS((trystate_T *sp, slang_T *slang, char_u *compflags, int flag)); 846 static int match_compoundrule __ARGS((slang_T *slang, char_u *compflags)); 843 847 static int valid_word_prefix __ARGS((int totprefcnt, int arridx, int flags, char_u *word, slang_T *slang, int cond_req)); 844 848 static void find_prefix __ARGS((matchinf_T *mip, int mode)); 845 849 static int fold_more __ARGS((matchinf_T *mip)); … … 1519 1523 ((unsigned)flags >> 24))) 1520 1524 continue; 1521 1525 1526 /* If there is a match with a CHECKCOMPOUNDPATTERN rule 1527 * discard the compound word. */ 1528 if (match_checkcompoundpattern(ptr, wlen, &slang->sl_comppat)) 1529 continue; 1530 1522 1531 if (mode == FIND_COMPOUND) 1523 1532 { 1524 1533 int capflags; … … 1577 1586 if (!can_compound(slang, fword, mip->mi_compflags)) 1578 1587 continue; 1579 1588 } 1589 else if (slang->sl_comprules != NULL 1590 && !match_compoundrule(slang, mip->mi_compflags)) 1591 /* The compound flags collected so far do not match any 1592 * COMPOUNDRULE, discard the compounded word. */ 1593 continue; 1580 1594 } 1581 1595 1582 1596 /* Check NEEDCOMPOUND: can't use word without compounding. */ … … 1727 1741 } 1728 1742 1729 1743 /* 1744 * Return TRUE if there is a match between the word ptr[wlen] and 1745 * CHECKCOMPOUNDPATTERN rules, assuming that we will concatenate with another 1746 * word. 1747 * A match means that the first part of CHECKCOMPOUNDPATTERN matches at the 1748 * end of ptr[wlen] and the second part matches after it. 1749 */ 1750 static int 1751 match_checkcompoundpattern(ptr, wlen, gap) 1752 char_u *ptr; 1753 int wlen; 1754 garray_T *gap; /* &sl_comppat */ 1755 { 1756 int i; 1757 char_u *p; 1758 int len; 1759 1760 for (i = 0; i + 1 < gap->ga_len; i += 2) 1761 { 1762 p = ((char_u **)gap->ga_data)[i + 1]; 1763 if (STRNCMP(ptr + wlen, p, STRLEN(p)) == 0) 1764 { 1765 /* Second part matches at start of following compound word, now 1766 * check if first part matches at end of previous word. */ 1767 p = ((char_u **)gap->ga_data)[i]; 1768 len = (int)STRLEN(p); 1769 if (len <= wlen && STRNCMP(ptr + wlen - len, p, len) == 0) 1770 return TRUE; 1771 } 1772 } 1773 return FALSE; 1774 } 1775 1776 /* 1730 1777 * Return TRUE if "flags" is a valid sequence of compound flags and "word" 1731 1778 * does not have too many syllables. 1732 1779 */ … … 1773 1820 } 1774 1821 1775 1822 /* 1823 * Return TRUE when the sequence of flags in "compflags" plus "flag" can 1824 * possibly form a valid compounded word. This also checks the COMPOUNDRULE 1825 * lines if they don't contain wildcards. 1826 */ 1827 static int 1828 can_be_compound(sp, slang, compflags, flag) 1829 trystate_T *sp; 1830 slang_T *slang; 1831 char_u *compflags; 1832 int flag; 1833 { 1834 /* If the flag doesn't appear in sl_compstartflags or sl_compallflags 1835 * then it can't possibly compound. */ 1836 if (!byte_in_str(sp->ts_complen == sp->ts_compsplit 1837 ? slang->sl_compstartflags : slang->sl_compallflags, flag)) 1838 return FALSE; 1839 1840 /* If there are no wildcards, we can check if the flags collected so far 1841 * possibly can form a match with COMPOUNDRULE patterns. This only 1842 * makes sense when we have two or more words. */ 1843 if (slang->sl_comprules != NULL && sp->ts_complen > sp->ts_compsplit) 1844 { 1845 int v; 1846 1847 compflags[sp->ts_complen] = flag; 1848 compflags[sp->ts_complen + 1] = NUL; 1849 v = match_compoundrule(slang, compflags + sp->ts_compsplit); 1850 compflags[sp->ts_complen] = NUL; 1851 return v; 1852 } 1853 1854 return TRUE; 1855 } 1856 1857 1858 /* 1859 * Return TRUE if the compound flags in compflags[] match the start of any 1860 * compound rule. This is used to stop trying a compound if the flags 1861 * collected so far can't possibly match any compound rule. 1862 * Caller must check that slang->sl_comprules is not NULL. 1863 */ 1864 static int 1865 match_compoundrule(slang, compflags) 1866 slang_T *slang; 1867 char_u *compflags; 1868 { 1869 char_u *p; 1870 int i; 1871 int c; 1872 1873 /* loop over all the COMPOUNDRULE entries */ 1874 for (p = slang->sl_comprules; *p != NUL; ++p) 1875 { 1876 /* loop over the flags in the compound word we have made, match 1877 * them against the current rule entry */ 1878 for (i = 0; ; ++i) 1879 { 1880 c = compflags[i]; 1881 if (c == NUL) 1882 /* found a rule that matches for the flags we have so far */ 1883 return TRUE; 1884 if (*p == '/' || *p == NUL) 1885 break; /* end of rule, it's too short */ 1886 if (*p == '[') 1887 { 1888 int match = FALSE; 1889 1890 /* compare against all the flags in [] */ 1891 ++p; 1892 while (*p != ']' && *p != NUL) 1893 if (*p++ == c) 1894 match = TRUE; 1895 if (!match) 1896 break; /* none matches */ 1897 } 1898 else if (*p != c) 1899 break; /* flag of word doesn't match flag in pattern */ 1900 ++p; 1901 } 1902 1903 /* Skip to the next "/", where the next pattern starts. */ 1904 p = vim_strchr(p, '/'); 1905 if (p == NULL) 1906 break; 1907 } 1908 1909 /* Checked all the rules and none of them match the flags, so there 1910 * can't possibly be a compound starting with these flags. */ 1911 return FALSE; 1912 } 1913 1914 /* 1776 1915 * Return non-zero if the prefix indicated by "arridx" matches with the prefix 1777 1916 * ID in "flags" for the word "word". 1778 1917 * The WF_RAREPFX flag is included in the return value for a rare prefix. … … 2237 2376 2238 2377 /* If we are back at the starting line and there is no match then 2239 2378 * give up. */ 2240 if (lnum == wp->w_cursor.lnum && !found_one)2379 if (lnum == wp->w_cursor.lnum && (!found_one || wrapped)) 2241 2380 break; 2242 2381 2243 2382 /* Skip the characters at the start of the next line that were … … 2513 2652 lp->sl_midword = NULL; 2514 2653 2515 2654 vim_free(lp->sl_compprog); 2655 vim_free(lp->sl_comprules); 2516 2656 vim_free(lp->sl_compstartflags); 2517 2657 vim_free(lp->sl_compallflags); 2518 2658 lp->sl_compprog = NULL; 2659 lp->sl_comprules = NULL; 2519 2660 lp->sl_compstartflags = NULL; 2520 2661 lp->sl_compallflags = NULL; 2521 2662 … … 3460 3601 char_u *pp; 3461 3602 char_u *cp; 3462 3603 char_u *ap; 3604 char_u *crp; 3463 3605 int cnt; 3464 3606 garray_T *gap; 3465 3607 … … 3545 3687 slang->sl_compallflags = ap; 3546 3688 *ap = NUL; 3547 3689 3690 /* And a list of all patterns in their original form, for checking whether 3691 * compounding may work in match_compoundrule(). This is freed when we 3692 * encounter a wildcard, the check doesn't work then. */ 3693 crp = alloc(todo + 1); 3694 slang->sl_comprules = crp; 3695 3548 3696 pp = pat; 3549 3697 *pp++ = '^'; 3550 3698 *pp++ = '\\'; … … 3587 3735 atstart = 0; 3588 3736 } 3589 3737 } 3738 3739 /* Copy flag to "sl_comprules", unless we run into a wildcard. */ 3740 if (crp != NULL) 3741 { 3742 if (c == '+' || c == '*') 3743 { 3744 vim_free(slang->sl_comprules); 3745 slang->sl_comprules = NULL; 3746 crp = NULL; 3747 } 3748 else 3749 *crp++ = c; 3750 } 3751 3590 3752 if (c == '/') /* slash separates two items */ 3591 3753 { 3592 3754 *pp++ = '\\'; … … 3611 3773 *pp++ = '$'; 3612 3774 *pp = NUL; 3613 3775 3776 if (crp != NULL) 3777 *crp = NUL; 3778 3614 3779 slang->sl_compprog = vim_regcomp(pat, RE_MAGIC + RE_STRING + RE_STRICT); 3615 3780 vim_free(pat); 3616 3781 if (slang->sl_compprog == NULL) … … 4791 4956 * Structure that is used to store the items in the word tree. This avoids 4792 4957 * the need to keep track of each allocated thing, everything is freed all at 4793 4958 * once after ":mkspell" is done. 4959 * Note: "sb_next" must be just before "sb_data" to make sure the alignment of 4960 * "sb_data" is correct for systems where pointers must be aligned on 4961 * pointer-size boundaries and sizeof(pointer) > sizeof(int) (e.g., Sparc). 4794 4962 */ 4795 4963 #define SBLOCKSIZE 16000 /* size of sb_data */ 4796 4964 typedef struct sblock_S sblock_T; 4797 4965 struct sblock_S 4798 4966 { 4799 sblock_T *sb_next; /* next block in list */4800 4967 int sb_used; /* nr of bytes already in use */ 4968 sblock_T *sb_next; /* next block in list */ 4801 4969 char_u sb_data[1]; /* data, actually longer */ 4802 4970 }; 4803 4971 … … 4915 5083 } spellinfo_T; 4916 5084 4917 5085 static afffile_T *spell_read_aff __ARGS((spellinfo_T *spin, char_u *fname)); 5086 static int is_aff_rule __ARGS((char_u **items, int itemcnt, char *rulename, int mincount)); 4918 5087 static void aff_process_flags __ARGS((afffile_T *affile, affentry_T *entry)); 4919 5088 static int spell_info_item __ARGS((char_u *s)); 4920 5089 static unsigned affitem2flag __ARGS((int flagtype, char_u *item, char_u *fname, int lnum)); … … 4950 5119 static void put_sugtime __ARGS((spellinfo_T *spin, FILE *fd)); 4951 5120 static int write_vim_spell __ARGS((spellinfo_T *spin, char_u *fname)); 4952 5121 static void clear_node __ARGS((wordnode_T *node)); 4953 static int put_node __ARGS((FILE *fd, wordnode_T *node, int i ndex, int regionmask, int prefixtree));5122 static int put_node __ARGS((FILE *fd, wordnode_T *node, int idx, int regionmask, int prefixtree)); 4954 5123 static void spell_make_sugfile __ARGS((spellinfo_T *spin, char_u *wfname)); 4955 5124 static int sug_filltree __ARGS((spellinfo_T *spin, slang_T *slang)); 4956 5125 static int sug_maketable __ARGS((spellinfo_T *spin)); … … 5223 5392 /* Handle non-empty lines. */ 5224 5393 if (itemcnt > 0) 5225 5394 { 5226 if (STRCMP(items[0], "SET") == 0 && itemcnt == 2 5227 && aff->af_enc == NULL) 5395 if (is_aff_rule(items, itemcnt, "SET", 2) && aff->af_enc == NULL) 5228 5396 { 5229 5397 #ifdef FEAT_MBYTE 5230 5398 /* Setup for conversion from "ENC" to 'encoding'. */ … … 5239 5407 smsg((char_u *)_("Conversion in %s not supported"), fname); 5240 5408 #endif 5241 5409 } 5242 else if ( STRCMP(items[0], "FLAG") == 0 && itemcnt == 25410 else if (is_aff_rule(items, itemcnt, "FLAG", 2) 5243 5411 && aff->af_flagtype == AFT_CHAR) 5244 5412 { 5245 5413 if (STRCMP(items[1], "long") == 0) … … 5284 5452 spin->si_info = p; 5285 5453 } 5286 5454 } 5287 else if ( STRCMP(items[0], "MIDWORD") == 0 && itemcnt == 25455 else if (is_aff_rule(items, itemcnt, "MIDWORD", 2) 5288 5456 && midword == NULL) 5289 5457 { 5290 5458 midword = getroom_save(spin, items[1]); 5291 5459 } 5292 else if ( STRCMP(items[0], "TRY") == 0 && itemcnt == 2)5460 else if (is_aff_rule(items, itemcnt, "TRY", 2)) 5293 5461 { 5294 5462 /* ignored, we look in the tree for what chars may appear */ 5295 5463 } 5296 5464 /* TODO: remove "RAR" later */ 5297 else if (( STRCMP(items[0], "RAR") == 05298 || STRCMP(items[0], "RARE") == 0) && itemcnt == 25299 5465 else if ((is_aff_rule(items, itemcnt, "RAR", 2) 5466 || is_aff_rule(items, itemcnt, "RARE", 2)) 5467 && aff->af_rare == 0) 5300 5468 { 5301 5469 aff->af_rare = affitem2flag(aff->af_flagtype, items[1], 5302 5470 fname, lnum); 5303 5471 } 5304 5472 /* TODO: remove "KEP" later */ 5305 else if (( STRCMP(items[0], "KEP") == 05306 || STRCMP(items[0], "KEEPCASE") == 0) && itemcnt == 25473 else if ((is_aff_rule(items, itemcnt, "KEP", 2) 5474 || is_aff_rule(items, itemcnt, "KEEPCASE", 2)) 5307 5475 && aff->af_keepcase == 0) 5308 5476 { 5309 5477 aff->af_keepcase = affitem2flag(aff->af_flagtype, items[1], 5310 5478 fname, lnum); 5311 5479 } 5312 else if (STRCMP(items[0], "BAD") == 0 && itemcnt == 2 5313 && aff->af_bad == 0) 5480 else if ((is_aff_rule(items, itemcnt, "BAD", 2) 5481 || is_aff_rule(items, itemcnt, "FORBIDDENWORD", 2)) 5482 && aff->af_bad == 0) 5314 5483 { 5315 5484 aff->af_bad = affitem2flag(aff->af_flagtype, items[1], 5316 5485 fname, lnum); 5317 5486 } 5318 else if ( STRCMP(items[0], "NEEDAFFIX") == 0 && itemcnt == 25487 else if (is_aff_rule(items, itemcnt, "NEEDAFFIX", 2) 5319 5488 && aff->af_needaffix == 0) 5320 5489 { 5321 5490 aff->af_needaffix = affitem2flag(aff->af_flagtype, items[1], 5322 5491 fname, lnum); 5323 5492 } 5324 else if ( STRCMP(items[0], "CIRCUMFIX") == 0 && itemcnt == 25493 else if (is_aff_rule(items, itemcnt, "CIRCUMFIX", 2) 5325 5494 && aff->af_circumfix == 0) 5326 5495 { 5327 5496 aff->af_circumfix = affitem2flag(aff->af_flagtype, items[1], 5328 5497 fname, lnum); 5329 5498 } 5330 else if ( STRCMP(items[0], "NOSUGGEST") == 0 && itemcnt == 25499 else if (is_aff_rule(items, itemcnt, "NOSUGGEST", 2) 5331 5500 && aff->af_nosuggest == 0) 5332 5501 { 5333 5502 aff->af_nosuggest = affitem2flag(aff->af_flagtype, items[1], 5334 5503 fname, lnum); 5335 5504 } 5336 else if (STRCMP(items[0], "NEEDCOMPOUND") == 0 && itemcnt == 2 5505 else if ((is_aff_rule(items, itemcnt, "NEEDCOMPOUND", 2) 5506 || is_aff_rule(items, itemcnt, "ONLYINCOMPOUND", 2)) 5337 5507 && aff->af_needcomp == 0) 5338 5508 { 5339 5509 aff->af_needcomp = affitem2flag(aff->af_flagtype, items[1], 5340 5510 fname, lnum); 5341 5511 } 5342 else if ( STRCMP(items[0], "COMPOUNDROOT") == 0 && itemcnt == 25512 else if (is_aff_rule(items, itemcnt, "COMPOUNDROOT", 2) 5343 5513 && aff->af_comproot == 0) 5344 5514 { 5345 5515 aff->af_comproot = affitem2flag(aff->af_flagtype, items[1], 5346 5516 fname, lnum); 5347 5517 } 5348 else if ( STRCMP(items[0], "COMPOUNDFORBIDFLAG") == 05349 && itemcnt == 2&& aff->af_compforbid == 0)5518 else if (is_aff_rule(items, itemcnt, "COMPOUNDFORBIDFLAG", 2) 5519 && aff->af_compforbid == 0) 5350 5520 { 5351 5521 aff->af_compforbid = affitem2flag(aff->af_flagtype, items[1], 5352 5522 fname, lnum); … … 5354 5524 smsg((char_u *)_("Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line %d"), 5355 5525 fname, lnum); 5356 5526 } 5357 else if ( STRCMP(items[0], "COMPOUNDPERMITFLAG") == 05358 && itemcnt == 2&& aff->af_comppermit == 0)5527 else if (is_aff_rule(items, itemcnt, "COMPOUNDPERMITFLAG", 2) 5528 && aff->af_comppermit == 0) 5359 5529 { 5360 5530 aff->af_comppermit = affitem2flag(aff->af_flagtype, items[1], 5361 5531 fname, lnum); … … 5363 5533 smsg((char_u *)_("Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line %d"), 5364 5534 fname, lnum); 5365 5535 } 5366 else if ( STRCMP(items[0], "COMPOUNDFLAG") == 0 && itemcnt == 25536 else if (is_aff_rule(items, itemcnt, "COMPOUNDFLAG", 2) 5367 5537 && compflags == NULL) 5368 5538 { 5369 5539 /* Turn flag "c" into COMPOUNDRULE compatible string "c+", … … 5376 5546 compflags = p; 5377 5547 } 5378 5548 } 5379 else if (STRCMP(items[0], "COMPOUNDRULE") == 0 && itemcnt == 2) 5549 else if (is_aff_rule(items, itemcnt, "COMPOUNDRULES", 2)) 5550 { 5551 /* We don't use the count, but do check that it's a number and 5552 * not COMPOUNDRULE mistyped. */ 5553 if (atoi((char *)items[1]) == 0) 5554 smsg((char_u *)_("Wrong COMPOUNDRULES value in %s line %d: %s"), 5555 fname, lnum, items[1]); 5556 } 5557 else if (is_aff_rule(items, itemcnt, "COMPOUNDRULE", 2)) 5380 5558 { 5381 5559 /* Concatenate this string to previously defined ones, using a 5382 5560 * slash to separate them. */ … … 5395 5573 compflags = p; 5396 5574 } 5397 5575 } 5398 else if ( STRCMP(items[0], "COMPOUNDWORDMAX") == 0 && itemcnt == 25576 else if (is_aff_rule(items, itemcnt, "COMPOUNDWORDMAX", 2) 5399 5577 && compmax == 0) 5400 5578 { 5401 5579 compmax = atoi((char *)items[1]); … … 5403 5581 smsg((char_u *)_("Wrong COMPOUNDWORDMAX value in %s line %d: %s"), 5404 5582 fname, lnum, items[1]); 5405 5583 } 5406 else if ( STRCMP(items[0], "COMPOUNDMIN") == 0 && itemcnt == 25584 else if (is_aff_rule(items, itemcnt, "COMPOUNDMIN", 2) 5407 5585 && compminlen == 0) 5408 5586 { 5409 5587 compminlen = atoi((char *)items[1]); … … 5411 5589 smsg((char_u *)_("Wrong COMPOUNDMIN value in %s line %d: %s"), 5412 5590 fname, lnum, items[1]); 5413 5591 } 5414 else if ( STRCMP(items[0], "COMPOUNDSYLMAX") == 0 && itemcnt == 25592 else if (is_aff_rule(items, itemcnt, "COMPOUNDSYLMAX", 2) 5415 5593 && compsylmax == 0) 5416 5594 { 5417 5595 compsylmax = atoi((char *)items[1]); … … 5419 5597 smsg((char_u *)_("Wrong COMPOUNDSYLMAX value in %s line %d: %s"), 5420 5598 fname, lnum, items[1]); 5421 5599 } 5422 else if ( STRCMP(items[0], "CHECKCOMPOUNDDUP") == 0 && itemcnt == 1)5600 else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDDUP", 1)) 5423 5601 { 5424 5602 compoptions |= COMP_CHECKDUP; 5425 5603 } 5426 else if ( STRCMP(items[0], "CHECKCOMPOUNDREP") == 0 && itemcnt == 1)5604 else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDREP", 1)) 5427 5605 { 5428 5606 compoptions |= COMP_CHECKREP; 5429 5607 } 5430 else if ( STRCMP(items[0], "CHECKCOMPOUNDCASE") == 0 && itemcnt == 1)5608 else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDCASE", 1)) 5431 5609 { 5432 5610 compoptions |= COMP_CHECKCASE; 5433 5611 } 5434 else if (STRCMP(items[0], "CHECKCOMPOUNDTRIPLE") == 0 5435 && itemcnt == 1) 5612 else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDTRIPLE", 1)) 5436 5613 { 5437 5614 compoptions |= COMP_CHECKTRIPLE; 5438 5615 } 5439 else if (STRCMP(items[0], "CHECKCOMPOUNDPATTERN") == 0 5440 && itemcnt == 2) 5616 else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDPATTERN", 2)) 5441 5617 { 5442 5618 if (atoi((char *)items[1]) == 0) 5443 5619 smsg((char_u *)_("Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"), 5444 5620 fname, lnum, items[1]); 5445 5621 } 5446 else if (STRCMP(items[0], "CHECKCOMPOUNDPATTERN") == 0 5447 && itemcnt == 3) 5622 else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDPATTERN", 3)) 5448 5623 { 5449 5624 garray_T *gap = &spin->si_comppat; 5450 5625 int i; … … 5463 5638 = getroom_save(spin, items[2]); 5464 5639 } 5465 5640 } 5466 else if ( STRCMP(items[0], "SYLLABLE") == 0 && itemcnt == 25641 else if (is_aff_rule(items, itemcnt, "SYLLABLE", 2) 5467 5642 && syllable == NULL) 5468 5643 { 5469 5644 syllable = getroom_save(spin, items[1]); 5470 5645 } 5471 else if ( STRCMP(items[0], "NOBREAK") == 0 && itemcnt == 1)5646 else if (is_aff_rule(items, itemcnt, "NOBREAK", 1)) 5472 5647 { 5473 5648 spin->si_nobreak = TRUE; 5474 5649 } 5475 else if ( STRCMP(items[0], "NOSPLITSUGS") == 0 && itemcnt == 1)5650 else if (is_aff_rule(items, itemcnt, "NOSPLITSUGS", 1)) 5476 5651 { 5477 5652 spin->si_nosplitsugs = TRUE; 5478 5653 } 5479 else if ( STRCMP(items[0], "NOSUGFILE") == 0 && itemcnt == 1)5654 else if (is_aff_rule(items, itemcnt, "NOSUGFILE", 1)) 5480 5655 { 5481 5656 spin->si_nosugfile = TRUE; 5482 5657 } 5483 else if ( STRCMP(items[0], "PFXPOSTPONE") == 0 && itemcnt == 1)5658 else if (is_aff_rule(items, itemcnt, "PFXPOSTPONE", 1)) 5484 5659 { 5485 5660 aff->af_pfxpostpone = TRUE; 5486 5661 } … … 5771 5946 } 5772 5947 } 5773 5948 } 5774 else if (STRCMP(items[0], "FOL") == 0 && itemcnt == 2 5775 && fol == NULL) 5949 else if (is_aff_rule(items, itemcnt, "FOL", 2) && fol == NULL) 5776 5950 { 5777 5951 fol = vim_strsave(items[1]); 5778 5952 } 5779 else if (STRCMP(items[0], "LOW") == 0 && itemcnt == 2 5780 && low == NULL) 5953 else if (is_aff_rule(items, itemcnt, "LOW", 2) && low == NULL) 5781 5954 { 5782 5955 low = vim_strsave(items[1]); 5783 5956 } 5784 else if (STRCMP(items[0], "UPP") == 0 && itemcnt == 2 5785 && upp == NULL) 5957 else if (is_aff_rule(items, itemcnt, "UPP", 2) && upp == NULL) 5786 5958 { 5787 5959 upp = vim_strsave(items[1]); 5788 5960 } 5789 else if ((STRCMP(items[0], "REP") == 0 5790 || STRCMP(items[0], "REPSAL") == 0) 5791 && itemcnt == 2) 5961 else if (is_aff_rule(items, itemcnt, "REP", 2) 5962 || is_aff_rule(items, itemcnt, "REPSAL", 2)) 5792 5963 { 5793 5964 /* Ignore REP/REPSAL count */; 5794 5965 if (!isdigit(*items[1])) … … 5819 5990 : &spin->si_rep, items[1], items[2]); 5820 5991 } 5821 5992 } 5822 else if ( STRCMP(items[0], "MAP") == 0 && itemcnt == 2)5993 else if (is_aff_rule(items, itemcnt, "MAP", 2)) 5823 5994 { 5824 5995 /* MAP item or count */ 5825 5996 if (!found_map) … … 5856 6027 ga_append(&spin->si_map, '/'); 5857 6028 } 5858 6029 } 5859 /* Accept "SAL from to" and "SAL from to # comment". */ 5860 else if (STRCMP(items[0], "SAL") == 0 5861 && (itemcnt == 3 || (itemcnt > 3 && items[3][0] == '#'))) 6030 /* Accept "SAL from to" and "SAL from to #comment". */ 6031 else if (is_aff_rule(items, itemcnt, "SAL", 3)) 5862 6032 { 5863 6033 if (do_sal) 5864 6034 { … … 5877 6047 : items[2]); 5878 6048 } 5879 6049 } 5880 else if ( STRCMP(items[0], "SOFOFROM") == 0 && itemcnt == 26050 else if (is_aff_rule(items, itemcnt, "SOFOFROM", 2) 5881 6051 && sofofrom == NULL) 5882 6052 { 5883 6053 sofofrom = getroom_save(spin, items[1]); 5884 6054 } 5885 else if ( STRCMP(items[0], "SOFOTO") == 0 && itemcnt == 26055 else if (is_aff_rule(items, itemcnt, "SOFOTO", 2) 5886 6056 && sofoto == NULL) 5887 6057 { 5888 6058 sofoto = getroom_save(spin, items[1]); … … 5980 6150 else if (spin->si_newprefID == 0 || spin->si_newprefID == 127) 5981 6151 MSG(_("Too many compound flags")); 5982 6152 else 5983 MSG(_("Too many pos poned prefixes and/or compound flags"));6153 MSG(_("Too many postponed prefixes and/or compound flags")); 5984 6154 } 5985 6155 5986 6156 if (syllable != NULL) … … 6017 6187 } 6018 6188 6019 6189 /* 6190 * Return TRUE when items[0] equals "rulename", there are "mincount" items or 6191 * a comment is following after item "mincount". 6192 */ 6193 static int 6194 is_aff_rule(items, itemcnt, rulename, mincount) 6195 char_u **items; 6196 int itemcnt; 6197 char *rulename; 6198 int mincount; 6199 { 6200 return (STRCMP(items[0], rulename) == 0 6201 && (itemcnt == mincount 6202 || (itemcnt > mincount && items[mincount][0] == '#'))); 6203 } 6204 6205 /* 6020 6206 * For affix "entry" move COMPOUNDFORBIDFLAG and COMPOUNDPERMITFLAG from 6021 6207 * ae_flags to ae_comppermit and ae_compforbid. 6022 6208 */ … … 7926 8112 char_u *p; 7927 8113 int rr; 7928 8114 int retval = OK; 8115 size_t fwv = 1; /* collect return value of fwrite() to avoid 8116 warnings from picky compiler */ 7929 8117 7930 8118 fd = mch_fopen((char *)fname, "w"); 7931 8119 if (fd == NULL) … … 7936 8124 7937 8125 /* <HEADER>: <fileID> <versionnr> */ 7938 8126 /* <fileID> */ 7939 if (fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, (size_t)1, fd) != 1)7940 {7941 EMSG(_(e_write));7942 retval = FAIL;7943 } 8127 fwv &= fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, (size_t)1, fd); 8128 if (fwv != (size_t)1) 8129 /* Catch first write error, don't try writing more. */ 8130 goto theend; 8131 7944 8132 putc(VIMSPELLVERSION, fd); /* <versionnr> */ 7945 8133 7946 8134 /* … … 7955 8143 7956 8144 i = (int)STRLEN(spin->si_info); 7957 8145 put_bytes(fd, (long_u)i, 4); /* <sectionlen> */ 7958 fw rite(spin->si_info, (size_t)i, (size_t)1, fd); /* <infotext> */8146 fwv &= fwrite(spin->si_info, (size_t)i, (size_t)1, fd); /* <infotext> */ 7959 8147 } 7960 8148 7961 8149 /* SN_REGION: <regionname> ... … … 7966 8154 putc(SNF_REQUIRED, fd); /* <sectionflags> */ 7967 8155 l = spin->si_region_count * 2; 7968 8156 put_bytes(fd, (long_u)l, 4); /* <sectionlen> */ 7969 fw rite(spin->si_region_name, (size_t)l, (size_t)1, fd);8157 fwv &= fwrite(spin->si_region_name, (size_t)l, (size_t)1, fd); 7970 8158 /* <regionname> ... */ 7971 8159 regionmask = (1 << spin->si_region_count) - 1; 7972 8160 } … … 8016 8204 } 8017 8205 8018 8206 put_bytes(fd, (long_u)l, 2); /* <folcharslen> */ 8019 fw rite(folchars, (size_t)l, (size_t)1, fd);/* <folchars> */8207 fwv &= fwrite(folchars, (size_t)l, (size_t)1, fd); /* <folchars> */ 8020 8208 } 8021 8209 8022 8210 /* SN_MIDWORD: <midword> */ … … 8027 8215 8028 8216 i = (int)STRLEN(spin->si_midword); 8029 8217 put_bytes(fd, (long_u)i, 4); /* <sectionlen> */ 8030 fwrite(spin->si_midword, (size_t)i, (size_t)1, fd); /* <midword> */ 8218 fwv &= fwrite(spin->si_midword, (size_t)i, (size_t)1, fd); 8219 /* <midword> */ 8031 8220 } 8032 8221 8033 8222 /* SN_PREFCOND: <prefcondcnt> <prefcond> ... */ … … 8113 8302 p = rr == 1 ? ftp->ft_from : ftp->ft_to; 8114 8303 l = (int)STRLEN(p); 8115 8304 putc(l, fd); 8116 fwrite(p, l, (size_t)1, fd); 8305 if (l > 0) 8306 fwv &= fwrite(p, l, (size_t)1, fd); 8117 8307 } 8118 8308 } 8119 8309 … … 8131 8321 /* <sectionlen> */ 8132 8322 8133 8323 put_bytes(fd, (long_u)l, 2); /* <sofofromlen> */ 8134 fw rite(spin->si_sofofr, l, (size_t)1, fd);/* <sofofrom> */8324 fwv &= fwrite(spin->si_sofofr, l, (size_t)1, fd); /* <sofofrom> */ 8135 8325 8136 8326 l = (int)STRLEN(spin->si_sofoto); 8137 8327 put_bytes(fd, (long_u)l, 2); /* <sofotolen> */ 8138 fw rite(spin->si_sofoto, l, (size_t)1, fd);/* <sofoto> */8328 fwv &= fwrite(spin->si_sofoto, l, (size_t)1, fd); /* <sofoto> */ 8139 8329 } 8140 8330 8141 8331 /* SN_WORDS: <word> ... … … 8160 8350 l = (int)STRLEN(hi->hi_key) + 1; 8161 8351 len += l; 8162 8352 if (round == 2) /* <word> */ 8163 fw rite(hi->hi_key, (size_t)l, (size_t)1, fd);8353 fwv &= fwrite(hi->hi_key, (size_t)l, (size_t)1, fd); 8164 8354 --todo; 8165 8355 } 8166 8356 if (round == 1) … … 8176 8366 putc(0, fd); /* <sectionflags> */ 8177 8367 l = spin->si_map.ga_len; 8178 8368 put_bytes(fd, (long_u)l, 4); /* <sectionlen> */ 8179 fw rite(spin->si_map.ga_data, (size_t)l, (size_t)1, fd);8369 fwv &= fwrite(spin->si_map.ga_data, (size_t)l, (size_t)1, fd); 8180 8370 /* <mapstr> */ 8181 8371 } 8182 8372 … … 8232 8422 { 8233 8423 p = ((char_u **)(spin->si_comppat.ga_data))[i]; 8234 8424 putc((int)STRLEN(p), fd); /* <comppatlen> */ 8235 fwrite(p, (size_t)STRLEN(p), (size_t)1, fd);/* <comppattext> */ 8425 fwv &= fwrite(p, (size_t)STRLEN(p), (size_t)1, fd); 8426 /* <comppattext> */ 8236 8427 } 8237 8428 /* <compflags> */ 8238 fw rite(spin->si_compflags, (size_t)STRLEN(spin->si_compflags),8429 fwv &= fwrite(spin->si_compflags, (size_t)STRLEN(spin->si_compflags), 8239 8430 (size_t)1, fd); 8240 8431 } 8241 8432 … … 8259 8450 8260 8451 l = (int)STRLEN(spin->si_syllable); 8261 8452 put_bytes(fd, (long_u)l, 4); /* <sectionlen> */ 8262 fwrite(spin->si_syllable, (size_t)l, (size_t)1, fd); /* <syllable> */ 8453 fwv &= fwrite(spin->si_syllable, (size_t)l, (size_t)1, fd); 8454 /* <syllable> */ 8263 8455 } 8264 8456 8265 8457 /* end of <SECTIONS> */ … … 8295 8487 (void)put_node(fd, tree, 0, regionmask, round == 3); 8296 8488 } 8297 8489 8298 /* Write another byte to check for errors . */8490 /* Write another byte to check for errors (file system full). */ 8299 8491 if (putc(0, fd) == EOF) 8300 8492 retval = FAIL; 8301 8493 theend: 8302 8494 if (fclose(fd) == EOF) 8303 8495 retval = FAIL; 8304 8496 8497 if (fwv != (size_t)1) 8498 retval = FAIL; 8499 if (retval == FAIL) 8500 EMSG(_(e_write)); 8501 8305 8502 return retval; 8306 8503 } 8307 8504 … … 9890 10087 char_u *p; 9891 10088 int len; 9892 10089 int totlen; 10090 size_t x = 1; /* collect return value of fwrite() */ 9893 10091 9894 10092 if (fd != NULL) 9895 10093 put_bytes(fd, (long_u)gap->ga_len, 2); /* <prefcondcnt> */ … … 9906 10104 if (fd != NULL) 9907 10105 { 9908 10106 fputc(len, fd); 9909 fwrite(p, (size_t)len, (size_t)1, fd);10107 x &= fwrite(p, (size_t)len, (size_t)1, fd); 9910 10108 } 9911 10109 totlen += len; 9912 10110 } … … 11480 11678 vim_strncpy(preword + sp->ts_prewordlen, 11481 11679 tword + sp->ts_splitoff, 11482 11680 sp->ts_twordlen - sp->ts_splitoff); 11483 p = preword; 11484 while (*skiptowhite(p) != NUL) 11485 p = skipwhite(skiptowhite(p)); 11486 if (fword_ends && !can_compound(slang, p, 11487 compflags + sp->ts_compsplit)) 11488 /* Compound is not allowed. But it may still be 11489 * possible if we add another (short) word. */ 11681 11682 /* Verify CHECKCOMPOUNDPATTERN rules. */ 11683 if (match_checkcompoundpattern(preword, sp->ts_prewordlen, 11684 &slang->sl_comppat)) 11490 11685 compound_ok = FALSE; 11491 11686 11687 if (compound_ok) 11688 { 11689 p = preword; 11690 while (*skiptowhite(p) != NUL) 11691 p = skipwhite(skiptowhite(p)); 11692 if (fword_ends && !can_compound(slang, p, 11693 compflags + sp->ts_compsplit)) 11694 /* Compound is not allowed. But it may still be 11695 * possible if we add another (short) word. */ 11696 compound_ok = FALSE; 11697 } 11698 11492 11699 /* Get pointer to last char of previous word. */ 11493 11700 p = preword + sp->ts_prewordlen; 11494 11701 mb_ptr_back(preword, p); … … 11685 11892 && (slang->sl_compsylmax < MAXWLEN 11686 11893 || sp->ts_complen + 1 - sp->ts_compsplit 11687 11894 < slang->sl_compmax) 11688 && (byte_in_str(sp->ts_complen == sp->ts_compsplit 11689 ? slang->sl_compstartflags 11690 : slang->sl_compallflags, 11691 ((unsigned)flags >> 24)))) 11895 && (can_be_compound(sp, slang, 11896 compflags, ((unsigned)flags >> 24)))) 11897 11692 11898 { 11693 11899 try_compound = TRUE; 11694 11900 compflags[sp->ts_complen] = ((unsigned)flags >> 24); … … 14808 15014 14809 15015 case 0: 14810 15016 /* 14811 * Leng hts are equal, thus changes must result in same length: An15017 * Lengths are equal, thus changes must result in same length: An 14812 15018 * insert is only possible in combination with a delete. 14813 15019 * 1: check if for identical strings 14814 15020 */ -
src/structs.h
diff -Naur vim72.orig/src/structs.h vim72/src/structs.h
old new 459 459 typedef struct 460 460 { 461 461 int hide; /* TRUE when ":hide" was used */ 462 # ifdef FEAT_BROWSE 462 # ifdef FEAT_BROWSE_CMD 463 463 int browse; /* TRUE to invoke file dialog */ 464 464 # endif 465 465 # ifdef FEAT_WINDOWS … … 1784 1784 #endif 1785 1785 1786 1786 /* 1787 * The next three specify the offsets for displaying the buffer: 1787 * "w_topline", "w_leftcol" and "w_skipcol" specify the offsets for 1788 * displaying the buffer. 1788 1789 */ 1789 1790 linenr_T w_topline; /* buffer line number of the line at the 1790 1791 top of the window */ 1792 #ifdef FEAT_AUTOCMD 1793 char w_topline_was_set; /* flag set to TRUE when topline is set, 1794 e.g. by winrestview() */ 1795 #endif 1791 1796 #ifdef FEAT_DIFF 1792 1797 int w_topfill; /* number of filler lines above w_topline */ 1793 1798 int w_old_topfill; /* w_topfill at last redraw */ -
src/tag.c
diff -Naur vim72.orig/src/tag.c vim72/src/tag.c
old new 515 515 * If a count is supplied to the ":tag <name>" command, then 516 516 * jump to count'th matching tag. 517 517 */ 518 if (type == DT_TAG && count > 0)518 if (type == DT_TAG && *tag != NUL && count > 0) 519 519 cur_match = count - 1; 520 520 521 521 if (type == DT_SELECT || type == DT_JUMP … … 618 618 taglen_advance(taglen); 619 619 MSG_PUTS_ATTR(_("file\n"), hl_attr(HLF_T)); 620 620 621 for (i = 0; i < num_matches ; ++i)621 for (i = 0; i < num_matches && !got_int; ++i) 622 622 { 623 623 parse_match(matches[i], &tagp); 624 624 if (!new_tag && ( … … 655 655 } 656 656 if (msg_col > 0) 657 657 msg_putchar('\n'); 658 if (got_int) 659 break; 658 660 msg_advance(15); 659 661 660 662 /* print any extra fields */ … … 689 691 if (msg_col + ptr2cells(p) >= Columns) 690 692 { 691 693 msg_putchar('\n'); 694 if (got_int) 695 break; 692 696 msg_advance(15); 693 697 } 694 698 p = msg_outtrans_one(p, attr); … … 704 708 if (msg_col > 15) 705 709 { 706 710 msg_putchar('\n'); 711 if (got_int) 712 break; 707 713 msg_advance(15); 708 714 } 709 715 } … … 734 740 { 735 741 if (msg_col + (*p == TAB ? 1 : ptr2cells(p)) > Columns) 736 742 msg_putchar('\n'); 743 if (got_int) 744 break; 737 745 msg_advance(15); 738 746 739 747 /* skip backslash used for escaping command char */ … … 760 768 if (msg_col) 761 769 msg_putchar('\n'); 762 770 ui_breakcheck(); 763 if (got_int)764 {765 got_int = FALSE; /* only stop the listing */766 break;767 }768 771 } 772 if (got_int) 773 got_int = FALSE; /* only stop the listing */ 769 774 ask_for_selection = TRUE; 770 775 } 771 776 #if defined(FEAT_QUICKFIX) && defined(FEAT_EVAL) … … 2542 2547 { 2543 2548 ga_clear_strings(&tag_fnames); 2544 2549 do_tag(NULL, DT_FREE, 0, 0, 0); 2550 tag_freematch(); 2551 2552 # if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX) 2553 if (ptag_entry.tagname) 2554 { 2555 vim_free(ptag_entry.tagname); 2556 ptag_entry.tagname = NULL; 2557 } 2558 # endif 2545 2559 } 2546 2560 #endif 2547 2561 … … 2725 2739 */ 2726 2740 p_7f = vim_strchr(lbuf, 0x7f); 2727 2741 if (p_7f == NULL) 2742 { 2743 etag_fail: 2744 if (vim_strchr(lbuf, '\n') == NULL) 2745 { 2746 /* Truncated line. Ignore it. */ 2747 if (p_verbose >= 5) 2748 { 2749 verbose_enter(); 2750 MSG(_("Ignoring long line in tags file")); 2751 verbose_leave(); 2752 } 2753 tagp->command = lbuf; 2754 tagp->tagname = lbuf; 2755 tagp->tagname_end = lbuf; 2756 return OK; 2757 } 2728 2758 return FAIL; 2759 } 2729 2760 2730 2761 /* Find ^A. If not found the line number is after the 0x7f */ 2731 2762 p = vim_strchr(p_7f, Ctrl_A); … … 2735 2766 ++p; 2736 2767 2737 2768 if (!VIM_ISDIGIT(*p)) /* check for start of line number */ 2738 return FAIL;2769 goto etag_fail; 2739 2770 tagp->command = p; 2740 2771 2741 2772 … … 2749 2780 /* find end of tagname */ 2750 2781 for (p = p_7f - 1; !vim_iswordc(*p); --p) 2751 2782 if (p == lbuf) 2752 return FAIL;2783 goto etag_fail; 2753 2784 tagp->tagname_end = p + 1; 2754 2785 while (p >= lbuf && vim_iswordc(*p)) 2755 2786 --p; -
src/term.c
diff -Naur vim72.orig/src/term.c vim72/src/term.c
old new 4920 4920 key_name[0] = KEY2TERMCAP0(key); 4921 4921 key_name[1] = KEY2TERMCAP1(key); 4922 4922 if (key_name[0] == KS_KEY) 4923 string[new_slen++] = key_name[1]; /* from ":set <M-b>=xx" */ 4923 { 4924 /* from ":set <M-b>=xx" */ 4925 #ifdef FEAT_MBYTE 4926 if (has_mbyte) 4927 new_slen += (*mb_char2bytes)(key_name[1], string + new_slen); 4928 else 4929 #endif 4930 string[new_slen++] = key_name[1]; 4931 } 4924 4932 else 4925 4933 { 4926 4934 string[new_slen++] = K_SPECIAL; -
src/testdir/Makefile
diff -Naur vim72.orig/src/testdir/Makefile vim72/src/testdir/Makefile
old new 26 26 27 27 .SUFFIXES: .in .out 28 28 29 nongui: nolog $(SCRIPTS) 30 @echo 31 @cat test.log 32 @echo ALL DONE 29 nongui: nolog $(SCRIPTS) report 30 31 gui: nolog $(SCRIPTS) $(SCRIPTS_GUI) report 33 32 34 gui: nolog $(SCRIPTS) $(SCRIPTS_GUI) 33 report: 35 34 @echo 36 @cat test.log 37 @echo ALL DONE 35 @echo 'Test results:' 36 @/bin/sh -c "if test -f test.log; \ 37 then cat test.log; echo TEST FAILURE; exit 1; \ 38 else echo ALL DONE; \ 39 fi" 38 40 39 41 $(SCRIPTS) $(SCRIPTS_GUI): $(VIMPROG) 40 42 … … 71 73 test60.out: test60.vim 72 74 73 75 nolog: 74 - echo Test results: >test.log76 -rm -f test.log -
src/testdir/Make_ming.mak
diff -Naur vim72.orig/src/testdir/Make_ming.mak vim72/src/testdir/Make_ming.mak
old new 1 # Makefile to run tests for Vim, on Dos-like machines 2 # with sh.exe or zsh.exe in the path or not. 3 # 4 # Author: Bill McCarthy 5 # 6 # Note that test54 has been removed until it is fixed. 7 # 8 # Requires a set of Unix tools: echo, diff, etc. 9 10 ifneq (sh.exe, $(SHELL)) 11 DEL = rm -f 12 MV = mv 13 CP = cp 14 DIRSLASH = / 15 else 16 DEL = del 17 MV = rename 18 CP = copy 19 DIRSLASH = \\ 20 endif 21 22 VIMPROG = ..$(DIRSLASH)vim 23 24 # Omitted: 25 # test2 "\\tmp" doesn't work. 26 # test10 'errorformat' is different 27 # test12 can't unlink a swap file 28 # test25 uses symbolic link 29 # test27 can't edit file with "*" in file name 30 # test31 16 bit version runs out of memory... 31 32 SCRIPTS16 = test1.out test19.out test20.out test22.out \ 33 test23.out test24.out test28.out test29.out \ 34 test35.out test36.out test43.out \ 35 test44.out test45.out test46.out test47.out \ 36 test48.out test51.out test53.out \ 37 test55.out test56.out test57.out test58.out test59.out \ 38 test60.out test61.out test62.out test63.out test64.out 39 40 # Had to remove test54 which doesn't work yet. 41 # test54.out 42 43 SCRIPTS = test3.out test4.out test5.out test6.out test7.out \ 44 test8.out test9.out test11.out test13.out test14.out \ 45 test15.out test17.out test18.out test21.out test26.out \ 46 test30.out test31.out test32.out test33.out test34.out \ 47 test37.out test38.out test39.out test40.out test41.out \ 48 test42.out test52.out test65.out 49 50 SCRIPTS32 = test50.out 51 52 SCRIPTS_GUI = test16.out 53 54 .SUFFIXES: .in .out 55 56 vimall: fixff $(SCRIPTS16) $(SCRIPTS) $(SCRIPTS_GUI) $(SCRIPTS32) 57 echo ALL DONE 58 59 nongui: fixff $(SCRIPTS16) $(SCRIPTS) 60 echo ALL DONE 61 62 small: 63 echo ALL DONE 64 65 gui: fixff $(SCRIPTS16) $(SCRIPTS) $(SCRIPTS_GUI) 66 echo ALL DONE 67 68 win32: fixff $(SCRIPTS16) $(SCRIPTS) $(SCRIPTS32) 69 echo ALL DONE 70 71 fixff: 72 -$(VIMPROG) -u dos.vim --noplugin "+argdo set ff=dos|upd" +q *.in *.ok 73 74 clean: 75 -$(DEL) *.out 76 -$(DEL) test.ok 77 -$(DEL) small.vim 78 -$(DEL) tiny.vim 79 -$(DEL) mbyte.vim 80 -$(DEL) X* 81 -$(DEL) viminfo 82 83 .in.out: 84 $(CP) $*.ok test.ok 85 $(VIMPROG) -u dos.vim -U NONE --noplugin -s dotest.in $*.in 86 diff test.out $*.ok 87 -$(DEL) $*.out 88 $(MV) test.out $*.out 89 -$(DEL) X* 90 -$(DEL) test.ok 91 -$(DEL) viminfo -
src/testdir/test42.ok
diff -Naur vim72.orig/src/testdir/test42.ok vim72/src/testdir/test42.ok
old new 20 20 ucs-2 21 21 22 22 23 fileencoding=u cs-2le23 fileencoding=utf-16le 24 24 bomb 25 25 ucs-2le 26 26 -
src/ui.c
diff -Naur vim72.orig/src/ui.c vim72/src/ui.c
old new 1820 1820 #ifdef HAVE_DUP 1821 1821 /* Use stderr for stdin, also works for shell commands. */ 1822 1822 close(0); 1823 dup(2);1823 ignored = dup(2); 1824 1824 #else 1825 1825 read_cmd_fd = 2; /* read from stderr instead of stdin */ 1826 1826 #endif … … 2020 2020 2021 2021 if (value == NULL || *length == 0) 2022 2022 { 2023 clip_free_selection(cbd); /* ??? [what's the query?]*/2023 clip_free_selection(cbd); /* nothing received, clear register */ 2024 2024 *(int *)success = FALSE; 2025 2025 return; 2026 2026 } … … 2076 2076 text_prop.value = (unsigned char *)value; 2077 2077 text_prop.encoding = *type; 2078 2078 text_prop.format = *format; 2079 text_prop.nitems = STRLEN(value);2079 text_prop.nitems = len; 2080 2080 status = XmbTextPropertyToTextList(X_DISPLAY, &text_prop, 2081 2081 &text_list, &n_text); 2082 2082 if (status != Success || n_text < 1) … … 2110 2110 int i; 2111 2111 int nbytes = 0; 2112 2112 char_u *buffer; 2113 time_t start_time; 2114 int timed_out = FALSE; 2113 2115 2114 2116 for (i = 2115 2117 #ifdef FEAT_MBYTE … … 2129 2131 case 3: type = text_atom; break; 2130 2132 default: type = XA_STRING; 2131 2133 } 2134 success = MAYBE; 2132 2135 XtGetSelectionValue(myShell, cbd->sel_atom, type, 2133 2136 clip_x11_request_selection_cb, (XtPointer)&success, CurrentTime); 2134 2137 … … 2141 2144 * characters, then they will appear before the one that requested the 2142 2145 * paste! Don't worry, we will catch up with any other events later. 2143 2146 */ 2144 for (;;) 2147 start_time = time(NULL); 2148 while (success == MAYBE) 2145 2149 { 2146 if (XCheckTypedEvent(dpy, SelectionNotify, &event)) 2147 break; 2148 if (XCheckTypedEvent(dpy, SelectionRequest, &event)) 2149 /* We may get a SelectionRequest here and if we don't handle 2150 * it we hang. KDE klipper does this, for example. */ 2150 if (XCheckTypedEvent(dpy, SelectionNotify, &event) 2151 || XCheckTypedEvent(dpy, SelectionRequest, &event) 2152 || XCheckTypedEvent(dpy, PropertyNotify, &event)) 2153 { 2154 /* This is where clip_x11_request_selection_cb() should be 2155 * called. It may actually happen a bit later, so we loop 2156 * until "success" changes. 2157 * We may get a SelectionRequest here and if we don't handle 2158 * it we hang. KDE klipper does this, for example. 2159 * We need to handle a PropertyNotify for large selections. */ 2151 2160 XtDispatchEvent(&event); 2161 continue; 2162 } 2163 2164 /* Time out after 2 to 3 seconds to avoid that we hang when the 2165 * other process doesn't respond. Note that the SelectionNotify 2166 * event may still come later when the selection owner comes back 2167 * to life and the text gets inserted unexpectedly. Don't know 2168 * why that happens or how to avoid that :-(. */ 2169 if (time(NULL) > start_time + 2) 2170 { 2171 timed_out = TRUE; 2172 break; 2173 } 2152 2174 2153 2175 /* Do we need this? Probably not. */ 2154 2176 XSync(dpy, False); 2155 2177 2156 /* Bernhard Walle solved a slow paste response in an X terminal by2157 * adding: usleep(10000); here. */2178 /* Wait for 1 msec to avoid that we eat up all CPU time. */ 2179 ui_delay(1L, TRUE); 2158 2180 } 2159 2181 2160 /* this is where clip_x11_request_selection_cb() is actually called */ 2161 XtDispatchEvent(&event); 2162 2163 if (success) 2182 if (success == TRUE) 2164 2183 return; 2184 2185 /* don't do a retry with another type after timing out, otherwise we 2186 * hang for 15 seconds. */ 2187 if (timed_out) 2188 break; 2165 2189 } 2166 2190 2167 2191 /* Final fallback position - use the X CUT_BUFFER0 store */ -
src/version.c
diff -Naur vim72.orig/src/version.c vim72/src/version.c
old new 677 677 static int included_patches[] = 678 678 { /* Add new patch number below this line */ 679 679 /**/ 680 124, 681 /**/ 682 123, 683 /**/ 684 122, 685 /**/ 686 121, 687 /**/ 688 120, 689 /**/ 690 119, 691 /**/ 692 118, 693 /**/ 694 117, 695 /**/ 696 116, 697 /**/ 698 115, 699 /**/ 700 114, 701 /**/ 702 113, 703 /**/ 704 112, 705 /**/ 706 111, 707 /**/ 708 110, 709 /**/ 710 109, 711 /**/ 712 108, 713 /**/ 714 107, 715 /**/ 716 106, 717 /**/ 718 105, 719 /**/ 720 104, 721 /**/ 722 103, 723 /**/ 724 102, 725 /**/ 726 100, 727 /**/ 728 99, 729 /**/ 730 98, 731 /**/ 732 97, 733 /**/ 734 96, 735 /**/ 736 95, 737 /**/ 738 94, 739 /**/ 740 92, 741 /**/ 742 91, 743 /**/ 744 90, 745 /**/ 746 87, 747 /**/ 748 86, 749 /**/ 750 85, 751 /**/ 752 84, 753 /**/ 754 83, 755 /**/ 756 82, 757 /**/ 758 81, 759 /**/ 760 80, 761 /**/ 762 79, 763 /**/ 764 78, 765 /**/ 766 77, 767 /**/ 768 76, 769 /**/ 770 75, 771 /**/ 772 73, 773 /**/ 774 70, 775 /**/ 776 69, 777 /**/ 778 68, 779 /**/ 780 67, 781 /**/ 782 66, 783 /**/ 784 65, 785 /**/ 786 64, 787 /**/ 788 63, 789 /**/ 790 62, 791 /**/ 792 61, 793 /**/ 794 60, 795 /**/ 796 59, 797 /**/ 798 58, 799 /**/ 800 57, 801 /**/ 802 56, 803 /**/ 804 55, 805 /**/ 806 54, 807 /**/ 808 53, 809 /**/ 810 52, 811 /**/ 812 51, 813 /**/ 814 50, 815 /**/ 816 48, 817 /**/ 818 47, 819 /**/ 820 46, 821 /**/ 822 45, 823 /**/ 824 44, 825 /**/ 826 43, 827 /**/ 828 42, 829 /**/ 830 40, 831 /**/ 832 39, 833 /**/ 834 38, 835 /**/ 836 37, 837 /**/ 838 35, 839 /**/ 840 34, 841 /**/ 842 33, 843 /**/ 844 32, 845 /**/ 846 31, 847 /**/ 848 30, 849 /**/ 850 29, 851 /**/ 852 28, 853 /**/ 854 27, 855 /**/ 856 26, 857 /**/ 858 25, 859 /**/ 860 24, 861 /**/ 862 23, 863 /**/ 864 22, 865 /**/ 866 21, 867 /**/ 868 20, 869 /**/ 870 19, 871 /**/ 872 18, 873 /**/ 874 17, 875 /**/ 876 16, 877 /**/ 878 15, 879 /**/ 880 14, 881 /**/ 882 13, 883 /**/ 884 12, 885 /**/ 886 11, 887 /**/ 888 10, 889 /**/ 890 9, 891 /**/ 892 8, 893 /**/ 894 6, 895 /**/ 896 5, 897 /**/ 898 4, 899 /**/ 900 3, 901 /**/ 902 2, 903 /**/ 904 1, 905 /**/ 680 906 0 681 907 }; 682 908 909 /* 910 * Place to put a short description when adding a feature with a patch. 911 * Keep it short, e.g.,: "relative numbers", "persistent undo". 912 * Also add a comment marker to separate the lines. 913 * See the official Vim patches for the diff format: It must use a context of 914 * one line only. Create it by hand or use "diff -C2" and edit the patch. 915 */ 916 static char *(extra_patches[]) = 917 { /* Add your patch description below this line */ 918 /**/ 919 NULL 920 }; 921 683 922 int 684 923 highest_patch() 685 924 { … … 786 1025 MSG_PUTS(_("\nRISC OS version")); 787 1026 #endif 788 1027 #ifdef VMS 789 MSG_PUTS( "\nOpenVMS version");1028 MSG_PUTS(_("\nOpenVMS version")); 790 1029 # ifdef HAVE_PATHDEF 791 1030 if (*compiled_arch != NUL) 792 1031 { … … 825 1064 } 826 1065 } 827 1066 1067 /* Print the list of extra patch descriptions if there is at least one. */ 1068 if (extra_patches[0] != NULL) 1069 { 1070 MSG_PUTS(_("\nExtra patches: ")); 1071 s = ""; 1072 for (i = 0; extra_patches[i] != NULL; ++i) 1073 { 1074 MSG_PUTS(s); 1075 s = ", "; 1076 MSG_PUTS(extra_patches[i]); 1077 } 1078 } 1079 828 1080 #ifdef MODIFIED_BY 829 1081 MSG_PUTS("\n"); 830 1082 MSG_PUTS(_("Modified by ")); -
src/vim.h
diff -Naur vim72.orig/src/vim.h vim72/src/vim.h
old new 341 341 #ifdef BACKSLASH_IN_FILENAME 342 342 # define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`%#'\"|!<") 343 343 #else 344 # define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<") 345 # define SHELL_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<>();&") 344 # ifdef VMS 345 /* VMS allows a lot of characters in the file name */ 346 # define PATH_ESC_CHARS ((char_u *)" \t\n*?{`\\%#'\"|!") 347 # define SHELL_ESC_CHARS ((char_u *)" \t\n*?{`\\%#'|!()&") 348 # else 349 # define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<") 350 # define SHELL_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<>();&") 351 # endif 346 352 #endif 347 353 348 354 #define NUMBUFLEN 30 /* length of a buffer to store a number in ASCII */ … … 370 376 * Define __w64 as an empty token for everything but MSVC 7.x or later. 371 377 */ 372 378 # if !defined(_MSC_VER) || (_MSC_VER < 1300) 373 # define __w64 379 # define __w64 374 380 # endif 375 381 typedef unsigned long __w64 long_u; 376 382 typedef long __w64 long_i; … … 1051 1057 #define WSP_HELP 16 /* creating the help window */ 1052 1058 #define WSP_BELOW 32 /* put new window below/right */ 1053 1059 #define WSP_ABOVE 64 /* put new window above/left */ 1060 #define WSP_NEWLOC 128 /* don't copy location list */ 1054 1061 1055 1062 /* 1056 1063 * arguments for gui_set_shellsize() … … 1728 1735 #define VV_MOUSE_COL 51 1729 1736 #define VV_OP 52 1730 1737 #define VV_SEARCHFORWARD 53 1731 #define VV_LEN 54 /* number of v: vars */ 1738 #define VV_OLDFILES 54 1739 #define VV_LEN 55 /* number of v: vars */ 1732 1740 1733 1741 #ifdef FEAT_CLIPBOARD 1734 1742 … … 1979 1987 # endif 1980 1988 #endif 1981 1989 1990 #ifndef FEAT_NETBEANS_INTG 1991 # undef NBDEBUG 1992 #endif 1982 1993 #ifdef NBDEBUG /* Netbeans debugging. */ 1983 1994 # include "nbdebug.h" 1984 1995 #else … … 2054 2065 #define DOSO_VIMRC 1 /* loading vimrc file */ 2055 2066 #define DOSO_GVIMRC 2 /* loading gvimrc file */ 2056 2067 2068 /* flags for read_viminfo() and children */ 2069 #define VIF_WANT_INFO 1 /* load non-mark info */ 2070 #define VIF_WANT_MARKS 2 /* load file marks */ 2071 #define VIF_FORCEIT 4 /* overwrite info already read */ 2072 #define VIF_GET_OLDFILES 8 /* load v:oldfiles */ 2073 2057 2074 #endif /* VIM__H */ -
src/window.c
diff -Naur vim72.orig/src/window.c vim72/src/window.c
old new 12 12 static int path_is_url __ARGS((char_u *p)); 13 13 #if defined(FEAT_WINDOWS) || defined(PROTO) 14 14 static int win_split_ins __ARGS((int size, int flags, win_T *newwin, int dir)); 15 static void win_init __ARGS((win_T *newp, win_T *oldp ));15 static void win_init __ARGS((win_T *newp, win_T *oldp, int flags)); 16 16 static void frame_comp_pos __ARGS((frame_T *topfrp, int *row, int *col)); 17 17 static void frame_setheight __ARGS((frame_T *curfrp, int height)); 18 18 #ifdef FEAT_VERTSPLIT … … 593 593 ++allow_keys; /* no mapping for xchar, but allow key codes */ 594 594 if (xchar == NUL) 595 595 xchar = plain_vgetc(); 596 #ifdef FEAT_LANGMAP597 596 LANGMAP_ADJUST(xchar, TRUE); 598 #endif599 597 --no_mapping; 600 598 --allow_keys; 601 599 #ifdef FEAT_CMDL_INFO … … 912 910 return FAIL; 913 911 914 912 /* make the contents of the new window the same as the current one */ 915 win_init(wp, curwin );913 win_init(wp, curwin, flags); 916 914 } 917 915 918 916 /* … … 1161 1159 * Initialize window "newp" from window "oldp". 1162 1160 * Used when splitting a window and when creating a new tab page. 1163 1161 * The windows will both edit the same buffer. 1162 * WSP_NEWLOC may be specified in flags to prevent the location list from 1163 * being copied. 1164 1164 */ 1165 /*ARGSUSED*/ 1165 1166 static void 1166 win_init(newp, oldp )1167 win_init(newp, oldp, flags) 1167 1168 win_T *newp; 1168 1169 win_T *oldp; 1170 int flags; 1169 1171 { 1170 1172 int i; 1171 1173 … … 1190 1192 copy_jumplist(oldp, newp); 1191 1193 #endif 1192 1194 #ifdef FEAT_QUICKFIX 1193 copy_loclist(oldp, newp); 1195 if (flags & WSP_NEWLOC) 1196 { 1197 /* Don't copy the location list. */ 1198 newp->w_llist = NULL; 1199 newp->w_llist_ref = NULL; 1200 } 1201 else 1202 copy_loclist(oldp, newp); 1194 1203 #endif 1195 1204 if (oldp->w_localdir != NULL) 1196 1205 newp->w_localdir = vim_strsave(oldp->w_localdir); … … 3220 3229 else 3221 3230 { 3222 3231 /* First window in new tab page, initialize it from "oldwin". */ 3223 win_init(curwin, oldwin );3232 win_init(curwin, oldwin, 0); 3224 3233 3225 3234 # ifdef FEAT_SCROLLBIND 3226 3235 /* We don't want scroll-binding in the first window. */ … … 4028 4037 if (mch_dirname(cwd, MAXPATHL) == OK) 4029 4038 globaldir = vim_strsave(cwd); 4030 4039 } 4031 mch_chdir((char *)curwin->w_localdir);4032 shorten_fnames(TRUE);4040 if (mch_chdir((char *)curwin->w_localdir) == 0) 4041 shorten_fnames(TRUE); 4033 4042 } 4034 4043 else if (globaldir != NULL) 4035 4044 { 4036 4045 /* Window doesn't have a local directory and we are not in the global 4037 4046 * directory: Change to the global directory. */ 4038 mch_chdir((char *)globaldir);4047 ignored = mch_chdir((char *)globaldir); 4039 4048 vim_free(globaldir); 4040 4049 globaldir = NULL; 4041 4050 shorten_fnames(TRUE); -
src/workshop.c
diff -Naur vim72.orig/src/workshop.c vim72/src/workshop.c
old new 1121 1121 ? (char *)curbuf->b_sfname : "<None>"); 1122 1122 #endif 1123 1123 1124 strcpy(ffname, (char *) curbuf->b_ffname); 1125 *filename = ffname; /* copy so nobody can change b_ffname */ 1124 if (curbuf->b_ffname == NULL) 1125 ffname[0] = NUL; 1126 else 1127 /* copy so nobody can change b_ffname */ 1128 strcpy(ffname, (char *) curbuf->b_ffname); 1129 *filename = ffname; 1126 1130 *curLine = curwin->w_cursor.lnum; 1127 1131 *curCol = curwin->w_cursor.col; 1128 1132
Note:
See TracBrowser
for help on using the repository browser.