From: Ben Gras Date: Tue, 19 Dec 2006 13:15:16 +0000 (+0000) Subject: BSD versions of strcasecmp() and strncasecmp() after a bug X-Git-Tag: v3.1.3~132 X-Git-Url: http://zhaoyanbai.com/repos/named.html?a=commitdiff_plain;h=4daf936bd228655518f179752fcf337e60ac787e;p=minix.git BSD versions of strcasecmp() and strncasecmp() after a bug in strcasecmp() reported by Rogier Meurs . --- diff --git a/lib/ip/strcasecmp.c b/lib/ip/strcasecmp.c index 72556d502..0e6605614 100755 --- a/lib/ip/strcasecmp.c +++ b/lib/ip/strcasecmp.c @@ -1,43 +1,71 @@ /* -strcasecmp.c - -Created Oct 14, 1991 by Philip Homburg -*/ + * Copyright (c) 1987, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#include #include -#include - -#ifdef __STDC__ -#define _CONST const -#else -#define _CONST -#endif int strcasecmp(s1, s2) -_CONST char *s1, *s2; + const char *s1, *s2; { - int c1, c2; - while (c1= toupper(*s1++), c2= toupper(*s2++), c1 == c2 && (c1 & c2)) - ; - if (c1 & c2) - return c1 < c2 ? -1 : 1; - return c1 ? 1 : (c2 ? -1 : 0); + const u_char + *us1 = (const u_char *)s1, + *us2 = (const u_char *)s2; + + while (tolower(*us1) == tolower(*us2++)) + if (*us1++ == '\0') + return (0); + return (tolower(*us1) - tolower(*--us2)); } int -strncasecmp(s1, s2, len) -_CONST char *s1, *s2; -size_t len; +strncasecmp(s1, s2, n) + const char *s1, *s2; + size_t n; { - int c1, c2; - do { - if (len == 0) - return 0; - len--; - } while (c1= toupper(*s1++), c2= toupper(*s2++), c1 == c2 && (c1 & c2)) - ; - if (c1 & c2) - return c1 < c2 ? -1 : 1; - return c1 ? 1 : (c2 ? -1 : 0); + 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); }