lib/strutils: optimalize {starts,ends}with()

Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2013-09-10 12:18:20 +02:00
parent 9b5dc4cb8d
commit 646e159aa9
2 changed files with 40 additions and 69 deletions

View File

@ -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

View File

@ -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