1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
// SPDX-FileCopyrightText: 2024-2025, Alejandro Colomar <alx@kernel.org>
// SPDX-License-Identifier: BSD-3-Clause
#ifndef SHADOW_INCLUDE_LIB_STRING_STRCMP_STRCASEPREFIX_H_
#define SHADOW_INCLUDE_LIB_STRING_STRCMP_STRCASEPREFIX_H_
#include "config.h"
#include <stddef.h>
#include <string.h>
#include "attr.h"
#include "cast.h"
// string case-insensitive prefix
#define strcaseprefix(s, prefix) \
({ \
const char *p_; \
\
p_ = strcaseprefix_(s, prefix); \
\
_Generic(s, \
const char *: p_, \
const void *: p_, \
char *: const_cast(char *, p_), \
void *: const_cast(char *, p_) \
); \
})
ATTR_STRING(1) ATTR_STRING(2)
inline const char *strcaseprefix_(const char *s, const char *prefix);
// strprefix_(), but case-insensitive.
inline const char *
strcaseprefix_(const char *s, const char *prefix)
{
if (strncasecmp(s, prefix, strlen(prefix)) != 0)
return NULL;
return s + strlen(prefix);
}
#endif // include guard
|