mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-10 00:57:02 +02:00
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:
parent
8c866a3858
commit
ad8f8e8ffb
@ -42,6 +42,8 @@ int chunk_printf(struct chunk *chk, const char *fmt, ...)
|
|||||||
|
|
||||||
int chunk_htmlencode(struct chunk *dst, struct chunk *src);
|
int chunk_htmlencode(struct chunk *dst, struct chunk *src);
|
||||||
int chunk_asciiencode(struct chunk *dst, struct chunk *src, char qc);
|
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)
|
static inline void chunk_init(struct chunk *chk, char *str, size_t size)
|
||||||
{
|
{
|
||||||
|
49
src/chunk.c
49
src/chunk.c
@ -124,6 +124,55 @@ int chunk_asciiencode(struct chunk *dst, struct chunk *src, char qc)
|
|||||||
return dst->len;
|
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:
|
* Local variables:
|
||||||
|
Loading…
Reference in New Issue
Block a user