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