plugin/shada: Handle NUL characters with intchar correctly

Fixes #5482
This commit is contained in:
ZyX 2017-01-04 15:06:33 +03:00
parent d82f5d1ba2
commit 24b3b938e8
2 changed files with 38 additions and 12 deletions

View File

@ -241,8 +241,6 @@ function s:shada_check_type(type, val) abort
if msg isnot# 0 if msg isnot# 0
return msg return msg
endif endif
if a:val > 0 || a:val < 1
endif
return 0 return 0
elseif a:type is# 'binarray' elseif a:type is# 'binarray'
if type isnot# 'array' if type isnot# 'array'
@ -359,9 +357,14 @@ function s:shada_string(type, v) abort
if (has_key(s:SHADA_ENUMS, a:type) && type(a:v) == type(0) if (has_key(s:SHADA_ENUMS, a:type) && type(a:v) == type(0)
\&& has_key(s:SHADA_REV_ENUMS[a:type], a:v)) \&& has_key(s:SHADA_REV_ENUMS[a:type], a:v))
return s:SHADA_REV_ENUMS[a:type][a:v] return s:SHADA_REV_ENUMS[a:type][a:v]
elseif (a:type is# 'intchar' && type(a:v) == type(0) " Restricting a:v to be <= 127 is not necessary, but intchar constants are
\&& strtrans(nr2char(a:v)) is# nr2char(a:v)) " normally expected to be either ASCII printable characters or NUL.
return "'" . nr2char(a:v) . "'" elseif a:type is# 'intchar' && type(a:v) == type(0) && a:v >= 0 && a:v <= 127
if a:v > 0 && strtrans(nr2char(a:v)) is# nr2char(a:v)
return "'" . nr2char(a:v) . "'"
else
return "'\\" . a:v . "'"
endif
else else
return msgpack#string(a:v) return msgpack#string(a:v)
endif endif

View File

@ -609,6 +609,18 @@ describe('In autoload/shada.vim', function()
'abc', 'abc',
-1, -1,
]}] ]]):gsub('\n', '')) ]}] ]]):gsub('\n', ''))
-- Regression: NUL separator must be properly supported
sd2strings_eq({
'History entry with timestamp ' .. epoch .. ':',
' @ Description_ Value',
' - history type SEARCH',
' - contents ""',
' - separator \'\\0\'',
}, ([[ [{'type': 4, 'timestamp': 0, 'data': [
1,
'',
0x0
]}] ]]):gsub('\n', ''))
end) end)
it('works with register items', function() it('works with register items', function()
@ -837,7 +849,7 @@ describe('In autoload/shada.vim', function()
sd2strings_eq({ sd2strings_eq({
'Global mark with timestamp ' .. epoch .. ':', 'Global mark with timestamp ' .. epoch .. ':',
' % Key Description Value', ' % Key Description Value',
' + n name 20', ' + n name \'\\20\'',
' + f file name "foo"', ' + f file name "foo"',
' # Value is negative', ' # Value is negative',
' + l line number -10', ' + l line number -10',
@ -852,7 +864,18 @@ describe('In autoload/shada.vim', function()
sd2strings_eq({ sd2strings_eq({
'Global mark with timestamp ' .. epoch .. ':', 'Global mark with timestamp ' .. epoch .. ':',
' % Key Description Value', ' % Key Description Value',
' + n name 20', ' + n name 128',
' + f file name "foo"',
' + l line number 1',
' + c column 0',
}, ([[ [{'type': 7, 'timestamp': 0, 'data': {
'n': 128,
'f': 'foo',
}}] ]]):gsub('\n', ''))
sd2strings_eq({
'Global mark with timestamp ' .. epoch .. ':',
' % Key Description Value',
' + n name \'\\20\'',
' + f file name "foo"', ' + f file name "foo"',
' # Expected integer', ' # Expected integer',
' + l line number "FOO"', ' + l line number "FOO"',
@ -1123,7 +1146,7 @@ describe('In autoload/shada.vim', function()
'Local mark with timestamp ' .. epoch .. ':', 'Local mark with timestamp ' .. epoch .. ':',
' % Key Description Value', ' % Key Description Value',
' + f file name "foo"', ' + f file name "foo"',
' + n name 20', ' + n name \'\\20\'',
' # Value is negative', ' # Value is negative',
' + l line number -10', ' + l line number -10',
' # Value is negative', ' # Value is negative',
@ -1138,7 +1161,7 @@ describe('In autoload/shada.vim', function()
'Local mark with timestamp ' .. epoch .. ':', 'Local mark with timestamp ' .. epoch .. ':',
' % Key Description Value', ' % Key Description Value',
' + f file name "foo"', ' + f file name "foo"',
' + n name 20', ' + n name \'\\20\'',
' # Expected integer', ' # Expected integer',
' + l line number "FOO"', ' + l line number "FOO"',
' # Expected integer', ' # Expected integer',
@ -1932,13 +1955,13 @@ describe('In autoload/shada.vim', function()
'Buffer list with timestamp ' .. epoch .. ':', 'Buffer list with timestamp ' .. epoch .. ':',
' % Key Description Value', ' % Key Description Value',
' # Expected binary string', ' # Expected binary string',
' + f file name 10', ' + f file name \'\\10\'',
' + l line number 1', ' + l line number 1',
' + c column 0', ' + c column 0',
'', '',
' % Key Description Value', ' % Key Description Value',
' # Expected binary string', ' # Expected binary string',
' + f file name 20', ' + f file name \'\\20\'',
' + l line number 1', ' + l line number 1',
' + c column 0', ' + c column 0',
}) })
@ -1948,7 +1971,7 @@ describe('In autoload/shada.vim', function()
'Buffer list with timestamp ' .. epoch .. ':', 'Buffer list with timestamp ' .. epoch .. ':',
' % Key Description Value', ' % Key Description Value',
' # Expected binary string', ' # Expected binary string',
' + f file name 10', ' + f file name \'\\10\'',
' + l line number 1', ' + l line number 1',
' + c column 0', ' + c column 0',
'', '',