1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved. 24 * Copyright 2013 Garrett D'Amore <garrett@damore.org> 25 */ 26 27 /* 28 * Compare strings ignoring case difference. 29 * returns: s1>s2: >0 s1==s2: 0 s1<s2: <0 30 * All letters are converted to the lowercase and compared. 31 */ 32 33 #include "lint.h" 34 #include <stdlib.h> 35 #include <wchar.h> 36 #include <locale.h> 37 #include "libc.h" 38 39 /* Legacy Sun interfaces */ 40 #pragma weak wscasecmp = wcscasecmp 41 #pragma weak wsncasecmp = wcsncasecmp 42 43 int 44 wcscasecmp_l(const wchar_t *s1, const wchar_t *s2, locale_t loc) 45 { 46 if (s1 == s2) 47 return (0); 48 49 while (towlower_l(*s1, loc) == towlower_l(*s2, loc)) { 50 if (*s1 == 0) 51 return (0); 52 s1++; 53 s2++; 54 } 55 return (towlower_l(*s1, loc) - towlower_l(*s2, loc)); 56 } 57 58 int 59 wcscasecmp(const wchar_t *s1, const wchar_t *s2) 60 { 61 return (wcscasecmp_l(s1, s2, uselocale(NULL))); 62 } 63 64 int 65 wcsncasecmp_l(const wchar_t *s1, const wchar_t *s2, size_t n, locale_t loc) 66 { 67 if (s1 == s2) 68 return (0); 69 70 while ((towlower_l(*s1, loc) == towlower_l(*s2, loc)) && n--) { 71 if (*s1 == 0) 72 return (0); 73 s1++; 74 s2++; 75 } 76 return (towlower_l(*s1, loc) - towlower_l(*s2, loc)); 77 } 78 79 int 80 wcsncasecmp(const wchar_t *s1, const wchar_t *s2, size_t n) 81 { 82 return (wcsncasecmp_l(s1, s2, n, uselocale(NULL))); 83 } 84