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