forked from aniani/vim
patch 9.1.1076: vim_strnchr() is strange and unnecessary
Problem: vim_strnchr() is strange and unnecessary (after v9.1.1009) Solution: Remove vim_strnchr() and use memchr() instead. Also remove a comment referencing an #if that is no longer present. vim_strnchr() is strange in several ways: - It's named like vim_strchr(), but unlike vim_strchr() it doesn't support finding a multibyte char. - Its logic is similar to vim_strbyte(), but unlike vim_strbyte() it uses char instead of char_u. - It takes a pointer as its size argument, which isn't convenient for all its callers. - It allows embedded NULs, unlike other "strn*" functions which stop when encountering a NUL byte. In comparison, memchr() also allows embedded NULs, and it converts bytes in the string to (unsigned char). closes: #16579 Signed-off-by: zeertzjq <zeertzjq@outlook.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
f7cb9f9280
commit
34e1e8de91
@@ -34,14 +34,10 @@ static size_t test_charmatch_paths(diffcmppath_T *node, int lastdecision);
|
|||||||
line_len(const mmfile_t *m)
|
line_len(const mmfile_t *m)
|
||||||
{
|
{
|
||||||
char *s = m->ptr;
|
char *s = m->ptr;
|
||||||
size_t n = (size_t)m->size;
|
|
||||||
char *end;
|
char *end;
|
||||||
|
|
||||||
end = vim_strnchr(s, &n, '\n');
|
end = memchr(s, '\n', (size_t)m->size);
|
||||||
if (end)
|
return end ? (size_t)(end - s) : (size_t)m->size;
|
||||||
return (size_t)(end - s);
|
|
||||||
|
|
||||||
return (size_t)m->size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MATCH_CHAR_MAX_LEN 800
|
#define MATCH_CHAR_MAX_LEN 800
|
||||||
@@ -171,10 +167,11 @@ fastforward_buf_to_lnum(mmfile_t s, linenr_T lnum)
|
|||||||
{
|
{
|
||||||
for (int i = 0; i < lnum - 1; i++)
|
for (int i = 0; i < lnum - 1; i++)
|
||||||
{
|
{
|
||||||
size_t n = (size_t)s.size;
|
char *line_end;
|
||||||
|
|
||||||
s.ptr = vim_strnchr(s.ptr, &n, '\n');
|
line_end = memchr(s.ptr, '\n', (size_t)s.size);
|
||||||
s.size = (int)n;
|
s.size = line_end ? (int)(s.size - (line_end - s.ptr)) : 0;
|
||||||
|
s.ptr = line_end;
|
||||||
if (!s.ptr)
|
if (!s.ptr)
|
||||||
break;
|
break;
|
||||||
s.ptr++;
|
s.ptr++;
|
||||||
|
@@ -674,22 +674,6 @@ vim_strchr(char_u *string, int c)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sized version of strchr that can handle embedded NULs.
|
|
||||||
// Adjusts n to the new size.
|
|
||||||
char *
|
|
||||||
vim_strnchr(const char *p, size_t *n, int c)
|
|
||||||
{
|
|
||||||
while (*n > 0)
|
|
||||||
{
|
|
||||||
if (*p == c)
|
|
||||||
return (char *)p;
|
|
||||||
p++;
|
|
||||||
(*n)--;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Version of strchr() that only works for bytes and handles unsigned char
|
* Version of strchr() that only works for bytes and handles unsigned char
|
||||||
* strings with characters above 128 correctly. It also doesn't return a
|
* strings with characters above 128 correctly. It also doesn't return a
|
||||||
@@ -3558,8 +3542,6 @@ vim_vsnprintf_typval(
|
|||||||
str_arg_l = 0;
|
str_arg_l = 0;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Don't put the #if inside memchr(), it can be a
|
|
||||||
// macro.
|
|
||||||
// memchr on HP does not like n > 2^31 !!!
|
// memchr on HP does not like n > 2^31 !!!
|
||||||
char *q = memchr(str_arg, '\0',
|
char *q = memchr(str_arg, '\0',
|
||||||
precision <= (size_t)0x7fffffffL ? precision
|
precision <= (size_t)0x7fffffffL ? precision
|
||||||
|
@@ -704,6 +704,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1076,
|
||||||
/**/
|
/**/
|
||||||
1075,
|
1075,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user