Mercurial > vim
view src/testdir/test_gn.vim @ 34074:1629cc65d78d v9.1.0006
patch 9.1.0006: is*() and to*() function may be unsafe
Commit: https://github.com/vim/vim/commit/184f71cc6868a240dc872ed2852542bbc1d43e28
Author: Keith Thompson <Keith.S.Thompson@gmail.com>
Date: Thu Jan 4 21:19:04 2024 +0100
patch 9.1.0006: is*() and to*() function may be unsafe
Problem: is*() and to*() function may be unsafe
Solution: Add SAFE_* macros and start using those instead
(Keith Thompson)
Use SAFE_() macros for is*() and to*() functions
The standard is*() and to*() functions declared in <ctype.h> have
undefined behavior for negative arguments other than EOF. If plain char
is signed, passing an unchecked value from argv for from user input
to one of these functions has undefined behavior.
Solution: Add SAFE_*() macros that cast the argument to unsigned char.
Most implementations behave sanely for negative arguments, and most
character values in practice are non-negative, but it's still best
to avoid undefined behavior.
The change from #13347 has been omitted, as this has already been
separately fixed in commit ac709e2fc0db6d31abb7da96f743c40956b60c3a
(v9.0.2054)
fixes: #13332
closes: #13347
Signed-off-by: Keith Thompson <Keith.S.Thompson@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 04 Jan 2024 21:30:04 +0100 |
parents | 381bd66762ea |
children |
line wrap: on
line source
" Test for gn command func Test_gn_command() noautocmd new " replace a single char by itself quoted: call setline('.', 'abc x def x ghi x jkl') let @/ = 'x' exe "norm! cgn'x'\<esc>.." call assert_equal("abc 'x' def 'x' ghi 'x' jkl", getline('.')) sil! %d_ " simple search match call setline('.', 'foobar') let @/ = 'foobar' exe "norm! gncsearchmatch" call assert_equal('searchmatch', getline('.')) sil! %d _ " replace a multi-line match call setline('.', ['', 'one', 'two']) let @/ = 'one\_s*two\_s' exe "norm! gnceins\<CR>zwei" call assert_equal(['','eins','zwei'], getline(1,'$')) sil! %d _ " test count argument call setline('.', ['', 'abcdx | abcdx | abcdx']) let @/ = '[a]bcdx' exe "norm! 2gnd" call assert_equal(['','abcdx | | abcdx'], getline(1,'$')) sil! %d _ " join lines call setline('.', ['join ', 'lines']) let @/ = '$' exe "norm! 0gnd" call assert_equal(['join lines'], getline(1,'$')) sil! %d _ " zero-width match call setline('.', ['', 'zero width pattern']) let @/ = '\>\zs' exe "norm! 0gnd" call assert_equal(['', 'zerowidth pattern'], getline(1,'$')) sil! %d _ " delete first and last chars call setline('.', ['delete first and last chars']) let @/ = '^' exe "norm! 0gnd$" let @/ = '\zs' exe "norm! gnd" call assert_equal(['elete first and last char'], getline(1,'$')) sil! %d _ " using visual mode call setline('.', ['', 'uniquepattern uniquepattern']) exe "norm! /[u]niquepattern/s\<cr>vlgnd" call assert_equal(['', ' uniquepattern'], getline(1,'$')) sil! %d _ " backwards search call setline('.', ['my very excellent mother just served us nachos']) let @/ = 'mother' exe "norm! $cgNmongoose" call assert_equal(['my very excellent mongoose just served us nachos'], getline(1,'$')) sil! %d _ " search for single char call setline('.', ['','for (i=0; i<=10; i++)']) let @/ = 'i' exe "norm! cgnj" call assert_equal(['','for (j=0; i<=10; i++)'], getline(1,'$')) sil! %d _ " search hex char call setline('.', ['','Y']) set noignorecase let @/ = '\%x59' exe "norm! gnd" call assert_equal(['',''], getline(1,'$')) sil! %d _ " test repeating gdn call setline('.', ['', '1', 'Johnny', '2', 'Johnny', '3']) let @/ = 'Johnny' exe "norm! dgn." call assert_equal(['','1', '', '2', '', '3'], getline(1,'$')) sil! %d _ " test repeating gUgn call setline('.', ['', '1', 'Depp', '2', 'Depp', '3']) let @/ = 'Depp' exe "norm! gUgn." call assert_equal(['', '1', 'DEPP', '2', 'DEPP', '3'], getline(1,'$')) sil! %d _ " test using look-ahead assertions call setline('.', ['a:10', '', 'a:1', '', 'a:20']) let @/ = 'a:0\@!\zs\d\+' exe "norm! 2nygno\<esc>p" call assert_equal(['a:10', '', 'a:1', '1', '', 'a:20'], getline(1,'$')) sil! %d _ " test using nowrapscan set nowrapscan call setline(1, 'foo bar baz') exe "norm! /bar/e\<cr>" exe "norm! gnd" call assert_equal(['foo baz'], getline(1,'$')) sil! %d_ " search upwards with nowrapscan set call setline('.', ['foo', 'bar', 'foo', 'baz']) set nowrapscan let @/ = 'foo' $ norm! dgN call assert_equal(['foo', 'bar', '', 'baz'], getline(1,'$')) sil! %d_ " search using the \zs atom call setline(1, [' nnoremap', '', 'nnoremap']) set wrapscan&vim let @/ = '\_s\zsnnoremap' $ norm! cgnmatch call assert_equal([' nnoremap', '', 'match'], getline(1,'$')) sil! %d_ " make sure it works correctly for one-char wide search items call setline('.', ['abcdefghi']) let @/ = 'a' exe "norm! 0fhvhhgNgU" call assert_equal(['ABCDEFGHi'], getline(1,'$')) call setline('.', ['abcdefghi']) let @/ = 'b' " this gn wraps around the end of the file exe "norm! 0fhvhhgngU" call assert_equal(['aBCDEFGHi'], getline(1,'$')) sil! %d _ call setline('.', ['abcdefghi']) let @/ = 'f' exe "norm! 0vllgngU" call assert_equal(['ABCDEFghi'], getline(1,'$')) sil! %d _ call setline('.', ['12345678']) let @/ = '5' norm! gg0f7vhhhhgnd call assert_equal(['12348'], getline(1,'$')) sil! %d _ call setline('.', ['12345678']) let @/ = '5' norm! gg0f2vf7gNd call assert_equal(['1678'], getline(1,'$')) sil! %d _ set wrapscan&vim " Without 'wrapscan', in visual mode, running gn without a match should fail " but the visual mode should be kept. set nowrapscan call setline('.', 'one two') let @/ = 'one' call assert_beeps('normal 0wvlgn') exe "normal y" call assert_equal('tw', @") " with exclusive selection, run gn and gN set selection=exclusive normal 0gny call assert_equal('one', @") normal 0wgNy call assert_equal('one', @") set selection& endfunc func Test_gN_repeat() new call setline(1, 'this list is a list with a list of a list.') /list normal $gNgNgNx call assert_equal('list with a list of a list', @") bwipe! endfunc func Test_gN_then_gn() new call setline(1, 'this list is a list with a list of a last.') /l.st normal $gNgNgnx call assert_equal('last', @") call setline(1, 'this list is a list with a lust of a last.') /l.st normal $gNgNgNgnx call assert_equal('lust of a last', @") bwipe! endfunc func Test_gn_multi_line() new call setline(1, [ \ 'func Tm1()', \ ' echo "one"', \ 'endfunc', \ 'func Tm2()', \ ' echo "two"', \ 'endfunc', \ 'func Tm3()', \ ' echo "three"', \ 'endfunc', \]) /\v^func Tm\d\(\)\n.*\zs".*"\ze$ normal jgnrx call assert_equal(' echo xxxxx', getline(5)) bwipe! endfunc " vim: shiftwidth=2 sts=2 expandtab