lib/strutils: optimalize {starts,ends}with()
Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
parent
9b5dc4cb8d
commit
646e159aa9
|
@ -102,8 +102,45 @@ extern int parse_range(const char *str, int *lower, int *upper, int def);
|
|||
|
||||
extern int streq_except_trailing_slash(const char *s1, const char *s2);
|
||||
|
||||
extern char *startswith(const char *s, const char *prefix);
|
||||
extern char *startswith_no_case(const char *s, const char *prefix);
|
||||
extern char *endswith(const char *s, const char *postfix);
|
||||
/*
|
||||
* Match string beginning.
|
||||
*/
|
||||
static inline const char *startswith(const char *s, const char *prefix)
|
||||
{
|
||||
size_t sz = prefix ? strlen(prefix) : 0;
|
||||
|
||||
if (s && sz && strncmp(s, prefix, sz) == 0)
|
||||
return s + sz;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Case insensitive match string beginning.
|
||||
*/
|
||||
static inline const char *startswith_no_case(const char *s, const char *prefix)
|
||||
{
|
||||
size_t sz = prefix ? strlen(prefix) : 0;
|
||||
|
||||
if (s && sz && strncasecmp(s, prefix, sz) == 0)
|
||||
return s + sz;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Match string ending.
|
||||
*/
|
||||
static inline const char *endswith(const char *s, const char *postfix)
|
||||
{
|
||||
size_t sl = s ? strlen(s) : 0;
|
||||
size_t pl = postfix ? strlen(postfix) : 0;
|
||||
|
||||
if (pl == 0)
|
||||
return (char *)s + sl;
|
||||
if (sl < pl)
|
||||
return NULL;
|
||||
if (memcmp(s + sl - pl, postfix, pl) != 0)
|
||||
return NULL;
|
||||
return (char *)s + sl - pl;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -686,72 +686,6 @@ int streq_except_trailing_slash(const char *s1, const char *s2)
|
|||
return equal;
|
||||
}
|
||||
|
||||
/*
|
||||
* Match string beginning.
|
||||
*/
|
||||
char *startswith(const char *s, const char *prefix)
|
||||
{
|
||||
const char *a, *b;
|
||||
|
||||
assert(s);
|
||||
assert(prefix);
|
||||
|
||||
a = s, b = prefix;
|
||||
for (;;) {
|
||||
if (*b == 0)
|
||||
return (char *)a;
|
||||
if (*a != *b)
|
||||
return NULL;
|
||||
|
||||
a++, b++;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Case insensitive match string beginning.
|
||||
*/
|
||||
char *startswith_no_case(const char *s, const char *prefix)
|
||||
{
|
||||
const char *a, *b;
|
||||
|
||||
assert(s);
|
||||
assert(prefix);
|
||||
|
||||
a = s, b = prefix;
|
||||
for (;;) {
|
||||
if (*b == 0)
|
||||
return (char *)a;
|
||||
if (tolower(*a) != tolower(*b))
|
||||
return NULL;
|
||||
|
||||
a++, b++;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Match string ending.
|
||||
*/
|
||||
char *endswith(const char *s, const char *postfix)
|
||||
{
|
||||
size_t sl, pl;
|
||||
|
||||
assert(s);
|
||||
assert(postfix);
|
||||
|
||||
sl = strlen(s);
|
||||
pl = strlen(postfix);
|
||||
|
||||
if (pl == 0)
|
||||
return (char *)s + sl;
|
||||
|
||||
if (sl < pl)
|
||||
return NULL;
|
||||
|
||||
if (memcmp(s + sl - pl, postfix, pl) != 0)
|
||||
return NULL;
|
||||
|
||||
return (char *)s + sl - pl;
|
||||
}
|
||||
|
||||
#ifdef TEST_PROGRAM
|
||||
|
||||
|
|
Loading…
Reference in New Issue