1a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project/*	$OpenBSD: strcasecmp.c,v 1.6 2005/08/08 08:05:37 espie Exp $	*/
2a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
3a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project/*
4a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project * Copyright (c) 1987, 1993
5a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project *	The Regents of the University of California.  All rights reserved.
6a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project *
7a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project * Redistribution and use in source and binary forms, with or without
8a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project * modification, are permitted provided that the following conditions
9a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project * are met:
10a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
11a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
12a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
13a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
14a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project *    documentation and/or other materials provided with the distribution.
15a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project * 3. Neither the name of the University nor the names of its contributors
16a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project *    may be used to endorse or promote products derived from this software
17a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project *    without specific prior written permission.
18a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project *
19a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project * SUCH DAMAGE.
30a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project */
31a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
32a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project#include <string.h>
33a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
34a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projecttypedef unsigned char u_char;
35a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
36a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project/*
37a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project * This array is designed for mapping upper and lower case letter
38a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project * together for a case independent comparison.  The mappings are
39a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project * based upon ascii character sequences.
40a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project */
41a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projectstatic const u_char charmap[] = {
42a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
43a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
44a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
45a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
46a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
47a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
48a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
49a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
50a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
51a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
52a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
53a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
54a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
55a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
56a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
57a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
58a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
59a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
60a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
61a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
62a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
63a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
64a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
65a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
66a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
67a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317',
68a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327',
69a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
70a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
71a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
72a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
73a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	'\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
74a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project};
75a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
76a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projectint
77a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projectstrcasecmp(const char *s1, const char *s2)
78a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project{
79a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	const u_char *cm = charmap;
80a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	const u_char *us1 = (const u_char *)s1;
81a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	const u_char *us2 = (const u_char *)s2;
82a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
83a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	while (cm[*us1] == cm[*us2++])
84a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project		if (*us1++ == '\0')
85a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project			return (0);
86a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	return (cm[*us1] - cm[*--us2]);
87a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project}
88a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
89a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projectint
90a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Projectstrncasecmp(const char *s1, const char *s2, size_t n)
91a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project{
92a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	if (n != 0) {
93a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project		const u_char *cm = charmap;
94a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project		const u_char *us1 = (const u_char *)s1;
95a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project		const u_char *us2 = (const u_char *)s2;
96a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project
97a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project		do {
98a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project			if (cm[*us1] != cm[*us2++])
99a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project				return (cm[*us1] - cm[*--us2]);
100a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project			if (*us1++ == '\0')
10130a419afc3cdb641e350c7cfde753877675958e0André Goddard Rosa				break;
102a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project		} while (--n != 0);
10330a419afc3cdb641e350c7cfde753877675958e0André Goddard Rosa	}
104a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project	return (0);
105a27d2baa0c1a2ec70f47ea9199b1dd6762c8a34The Android Open Source Project}
106