MINOR: chunk: provide string compare functions

It's sometimes needed to be able to compare a zero-terminated string with a
chunk, so we now have two functions to do that, one strcmp() equivalent and
one strcasecmp() equivalent.
This commit is contained in:
Willy Tarreau 2012-10-19 15:18:06 +02:00
parent 8c866a3858
commit ad8f8e8ffb
2 changed files with 51 additions and 0 deletions

View File

@ -42,6 +42,8 @@ int chunk_printf(struct chunk *chk, const char *fmt, ...)
int chunk_htmlencode(struct chunk *dst, struct chunk *src);
int chunk_asciiencode(struct chunk *dst, struct chunk *src, char qc);
int chunk_strcmp(const struct chunk *chk, const char *str);
int chunk_strcasecmp(const struct chunk *chk, const char *str);
static inline void chunk_init(struct chunk *chk, char *str, size_t size)
{

View File

@ -124,6 +124,55 @@ int chunk_asciiencode(struct chunk *dst, struct chunk *src, char qc)
return dst->len;
}
/* Compares the string in chunk <chk> with the string in <str> which must be
* zero-terminated. Return is the same as with strcmp(). Neither is allowed
* to be null.
*/
int chunk_strcmp(const struct chunk *chk, const char *str)
{
const char *s1 = chk->str;
int len = chk->len;
int diff = 0;
do {
if (--len < 0)
break;
diff = (unsigned char)*(s1++) - (unsigned char)*(str++);
} while (!diff);
return diff;
}
/* Case-insensitively compares the string in chunk <chk> with the string in
* <str> which must be zero-terminated. Return is the same as with strcmp().
* Neither is allowed to be null.
*/
int chunk_strcasecmp(const struct chunk *chk, const char *str)
{
const char *s1 = chk->str;
int len = chk->len;
int diff = 0;
do {
if (--len < 0)
break;
diff = (unsigned char)*s1 - (unsigned char)*str;
if (unlikely(diff)) {
unsigned int l = (unsigned char)*s1;
unsigned int r = (unsigned char)*str;
l -= 'a';
r -= 'a';
if (likely(l <= (unsigned char)'z' - 'a'))
l -= 'a' - 'A';
if (likely(r <= (unsigned char)'z' - 'a'))
r -= 'a' - 'A';
diff = l - r;
}
s1++; str++;
} while (!diff);
return diff;
}
/*
* Local variables: