171671b9obrien/*
271671b9obrien * Copyright (c) 1987 Regents of the University of California.
371671b9obrien * All rights reserved.
471671b9obrien *
571671b9obrien * Redistribution and use in source and binary forms are permitted
671671b9obrien * provided that this notice is preserved and that due credit is given
771671b9obrien * to the University of California at Berkeley. The name of the University
871671b9obrien * may not be used to endorse or promote products derived from this
971671b9obrien * software without specific written prior permission. This software
1071671b9obrien * is provided ``as is'' without express or implied warranty.
1171671b9obrien */
1271671b9obrien
1371671b9obrien/*
1471671b9obrien
1571671b9obrien@deftypefn Supplemental int strncasecmp (const char *@var{s1}, const char *@var{s2})
1671671b9obrien
1771671b9obrienA case-insensitive @code{strncmp}.
1871671b9obrien
1971671b9obrien@end deftypefn
2071671b9obrien
2171671b9obrien*/
2271671b9obrien
2371671b9obrien#if defined(LIBC_SCCS) && !defined(lint)
2471671b9obrienstatic char sccsid[] = "@(#)strcasecmp.c	5.5 (Berkeley) 11/24/87";
2571671b9obrien#endif /* LIBC_SCCS and not lint */
2671671b9obrien
2771671b9obrien#include <ansidecl.h>
2871671b9obrien#include <stddef.h>
2971671b9obrien
3071671b9obrien/*
3171671b9obrien * This array is designed for mapping upper and lower case letter
3271671b9obrien * together for a case independent comparison.  The mappings are
3371671b9obrien * based upon ascii character sequences.
3471671b9obrien */
3571671b9obrienstatic const unsigned char charmap[] = {
3671671b9obrien	'\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
3771671b9obrien	'\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
3871671b9obrien	'\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
3971671b9obrien	'\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
4071671b9obrien	'\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
4171671b9obrien	'\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
4271671b9obrien	'\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
4371671b9obrien	'\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
4471671b9obrien	'\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
4571671b9obrien	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
4671671b9obrien	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
4771671b9obrien	'\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
4871671b9obrien	'\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
4971671b9obrien	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
5071671b9obrien	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
5171671b9obrien	'\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
5271671b9obrien	'\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
5371671b9obrien	'\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
5471671b9obrien	'\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
5571671b9obrien	'\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
5671671b9obrien	'\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
5771671b9obrien	'\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
5871671b9obrien	'\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
5971671b9obrien	'\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
6071671b9obrien	'\300', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
6171671b9obrien	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
6271671b9obrien	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
6371671b9obrien	'\370', '\371', '\372', '\333', '\334', '\335', '\336', '\337',
6471671b9obrien	'\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
6571671b9obrien	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
6671671b9obrien	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
6771671b9obrien	'\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
6871671b9obrien};
6971671b9obrien
7071671b9obrienint
710acbbeedimstrncasecmp(const char *s1, const char *s2, register size_t n)
7271671b9obrien{
7371671b9obrien    register unsigned char u1, u2;
7471671b9obrien
7571671b9obrien    for (; n != 0; --n) {
7671671b9obrien	u1 = (unsigned char) *s1++;
7771671b9obrien	u2 = (unsigned char) *s2++;
7871671b9obrien	if (charmap[u1] != charmap[u2]) {
7971671b9obrien	    return charmap[u1] - charmap[u2];
8071671b9obrien	}
8171671b9obrien	if (u1 == '\0') {
8271671b9obrien	    return 0;
8371671b9obrien	}
8471671b9obrien    }
8571671b9obrien    return 0;
8671671b9obrien}
87