diff --git a/dix/strcasecmp.c b/dix/strcasecmp.c index 58f0961e6..8f7c5c402 100644 --- a/dix/strcasecmp.c +++ b/dix/strcasecmp.c @@ -33,7 +33,7 @@ #ifdef NEED_STRCASECMP int -xstrcasecmp(char *str1,char *str2) +xstrcasecmp(const char *str1, const char *str2) { const u_char *us1 = (const u_char *)str1, *us2 = (const u_char *)str2; @@ -46,3 +46,22 @@ xstrcasecmp(char *str1,char *str2) return (tolower(*us1) - tolower(*us2)); } #endif + +#ifdef NEED_STRNCASECMP +int +xstrncasecmp(const char *s1, const char *s2, size_t n) +{ + if (n != 0) { + const u_char *us1 = (const u_char *)s1, *us2 = (const u_char *)s2; + + do { + if (tolower(*us1) != tolower(*us2++)) + return (tolower(*us1) - tolower(*--us2)); + if (*us1++ == '\0') + break; + } while (--n != 0); + } + + return 0; +} +#endif diff --git a/include/dix.h b/include/dix.h index 300718dd9..a8c2b3b5a 100644 --- a/include/dix.h +++ b/include/dix.h @@ -601,7 +601,12 @@ typedef struct { /* strcasecmp.c */ #if NEED_STRCASECMP #define strcasecmp xstrcasecmp -extern int xstrcasecmp(char *s1, char *s2); +extern int xstrcasecmp(const char *s1, const char *s2); +#endif + +#if NEED_STRNCASECMP +#define strncasecmp xstrncasecmp +extern int xstrncasecmp(const char *s1, const char *s2, size_t n); #endif extern int XItoCoreType(int xi_type);