Home | History | Annotate | Line # | Download | only in string
wcscasecmp.c revision 1.2.50.1
      1 /*	$NetBSD: wcscasecmp.c,v 1.2.50.1 2013/06/23 06:21:06 tls Exp $	*/
      2 
      3 /*
      4  * Copyright (C) 2006 Aleksey Cheusov
      5  *
      6  * This material is provided "as is", with absolutely no warranty expressed
      7  * or implied. Any use is at your own risk.
      8  *
      9  * Permission to use or copy this software for any purpose is hereby granted
     10  * without fee. Permission to modify the code and to distribute modified
     11  * code is also granted without any restrictions.
     12  */
     13 
     14 #include <sys/cdefs.h>
     15 #if defined(LIBC_SCCS) && !defined(lint)
     16 __RCSID("$NetBSD: wcscasecmp.c,v 1.2.50.1 2013/06/23 06:21:06 tls Exp $");
     17 #endif /* LIBC_SCCS and not lint */
     18 
     19 #include "namespace.h"
     20 #include <assert.h>
     21 #include <wchar.h>
     22 #include <wctype.h>
     23 #include <locale.h>
     24 #include "setlocale_local.h"
     25 
     26 __weak_alias(wcscasecmp,_wcscasecmp)
     27 __weak_alias(wcscasecmp_l,_wcscasecmp_l)
     28 
     29 int
     30 wcscasecmp_l(const wchar_t *s1, const wchar_t *s2, locale_t loc)
     31 {
     32 	int lc1  = 0;
     33 	int lc2  = 0;
     34 	int diff = 0;
     35 
     36 	_DIAGASSERT(s1);
     37 	_DIAGASSERT(s2);
     38 
     39 	for (;;) {
     40 		lc1 = towlower_l(*s1, loc);
     41 		lc2 = towlower_l(*s2, loc);
     42 
     43 		diff = lc1 - lc2;
     44 		if (diff)
     45 			return diff;
     46 
     47 		if (!lc1)
     48 			return 0;
     49 
     50 		++s1;
     51 		++s2;
     52 	}
     53 }
     54 
     55 int
     56 wcscasecmp(const wchar_t *s1, const wchar_t *s2)
     57 {
     58 	return wcscasecmp_l(s1, s2, _current_locale());
     59 }
     60