Home | History | Annotate | Line # | Download | only in lib
      1 /*	$NetBSD: strcasecmp.c,v 1.1.1.1 2016/01/14 00:11:29 christos Exp $	*/
      2 
      3 /* strcasecmp.c -- case insensitive string comparator
      4    Copyright (C) 1998, 1999 Free Software Foundation, Inc.
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 2, or (at your option)
      9    any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program; if not, write to the Free Software Foundation,
     18    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
     19 
     20 #if HAVE_CONFIG_H
     21 # include <config.h>
     22 #endif
     23 
     24 #ifdef LENGTH_LIMIT
     25 # define STRXCASECMP_FUNCTION strncasecmp
     26 # define STRXCASECMP_DECLARE_N , size_t n
     27 # define LENGTH_LIMIT_EXPR(Expr) Expr
     28 #else
     29 # define STRXCASECMP_FUNCTION strcasecmp
     30 # define STRXCASECMP_DECLARE_N /* empty */
     31 # define LENGTH_LIMIT_EXPR(Expr) 0
     32 #endif
     33 
     34 #include <stddef.h>
     35 #include <ctype.h>
     36 
     37 #define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
     38 
     39 /* Compare {{no more than N characters of }}strings S1 and S2,
     40    ignoring case, returning less than, equal to or
     41    greater than zero if S1 is lexicographically less
     42    than, equal to or greater than S2.  */
     43 
     44 int
     45 STRXCASECMP_FUNCTION (const char *s1, const char *s2 STRXCASECMP_DECLARE_N)
     46 {
     47   register const unsigned char *p1 = (const unsigned char *) s1;
     48   register const unsigned char *p2 = (const unsigned char *) s2;
     49   unsigned char c1, c2;
     50 
     51   if (p1 == p2 || LENGTH_LIMIT_EXPR (n == 0))
     52     return 0;
     53 
     54   do
     55     {
     56       c1 = TOLOWER (*p1);
     57       c2 = TOLOWER (*p2);
     58 
     59       if (LENGTH_LIMIT_EXPR (--n == 0) || c1 == '\0')
     60 	break;
     61 
     62       ++p1;
     63       ++p2;
     64     }
     65   while (c1 == c2);
     66 
     67   return c1 - c2;
     68 }
     69