Files
neovim/src/nvim/strings.h
zeertzjq 204774c1e2 vim-patch:9.2.0743: string macros silently accept a size of the wrong type (#40470)
Problem:  Several string and memory wrapper macros cast their size
          argument to size_t although the wrapped function's prototype
          already declares that parameter size_t; such casts silence the
          warning a compiler would otherwise give when a value of the
          wrong type, such as a pointer, is passed as the size.
Solution: Where the wrapped function's prototype already declares the
          parameter size_t, remove the cast so that a size argument of
          the wrong type can be reported at compile time (K.Takata,
          Shane Harper).

From gcc 14 on, -Wint-conversion is an error by default.

With gcc, passing a signed value where size_t is expected triggers
-Wsign-conversion, but the check is off by default and the build already
emits many such warnings.

related: vim/vim#20642
closes:  vim/vim#20656

7f122f9eff

Co-authored-by: Shane Harper <shane@shaneharper.net>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 00:27:45 +00:00

65 lines
1.9 KiB
C

#pragma once
#include <stdarg.h> // IWYU pragma: keep
#include <string.h>
#include "auto/config.h"
#include "nvim/api/private/defs.h" // IWYU pragma: keep
#include "nvim/eval/typval_defs.h" // IWYU pragma: keep
#include "nvim/os/os_defs.h"
#include "nvim/types_defs.h" // IWYU pragma: keep
// Return the length of a string literal
#define STRLEN_LITERAL(s) (sizeof(s) - 1)
/// Store a key/value pair
typedef struct {
int key; ///< the key
char *value; ///< the value string
size_t length; ///< length of the value string
} keyvalue_T;
#define KEYVALUE_ENTRY(k, v) { (k), (v), STRLEN_LITERAL(v) }
#include "strings.h.generated.h"
#include "strings.h.inline.generated.h"
/// Append string to string and return pointer to the next byte
///
/// Unlike strcat, this one does *not* add NUL byte and returns pointer to the
/// past of the added string.
///
/// @param[out] dst String to append to.
/// @param[in] src String to append.
///
/// @return pointer to the byte just past the appended byte.
static inline char *strappend(char *const dst, const char *const src)
FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_NONNULL_ALL
FUNC_ATTR_NONNULL_RET FUNC_ATTR_WARN_UNUSED_RESULT
{
const size_t src_len = strlen(src);
return (char *)memmove(dst, src, src_len) + src_len;
}
#ifdef HAVE_STRCASECMP
# define STRICMP(d, s) strcasecmp((char *)(d), (char *)(s))
#else
# ifdef HAVE_STRICMP
# define STRICMP(d, s) stricmp((char *)(d), (char *)(s))
# else
# define STRICMP(d, s) vim_stricmp((char *)(d), (char *)(s))
# endif
#endif
#ifdef HAVE_STRNCASECMP
# define STRNICMP(d, s, n) strncasecmp((char *)(d), (char *)(s), (n))
#else
# ifdef HAVE_STRNICMP
# define STRNICMP(d, s, n) strnicmp((char *)(d), (char *)(s), (n))
# else
# define STRNICMP(d, s, n) vim_strnicmp((char *)(d), (char *)(s), (n))
# endif
#endif
#define kv_printf(v, ...) kv_do_printf(&(v), __VA_ARGS__)