xref: /openbsd-src/gnu/lib/libiberty/src/strncasecmp.c (revision 150b7e42cfa21e6546d96ae514ca23e80d970ac7)
100bf4279Sespie /*
200bf4279Sespie  * Copyright (c) 1987 Regents of the University of California.
300bf4279Sespie  * All rights reserved.
400bf4279Sespie  *
500bf4279Sespie  * Redistribution and use in source and binary forms are permitted
600bf4279Sespie  * provided that this notice is preserved and that due credit is given
700bf4279Sespie  * to the University of California at Berkeley. The name of the University
800bf4279Sespie  * may not be used to endorse or promote products derived from this
900bf4279Sespie  * software without specific written prior permission. This software
1000bf4279Sespie  * is provided ``as is'' without express or implied warranty.
1100bf4279Sespie  */
1200bf4279Sespie 
139588ddcfSespie /*
149588ddcfSespie 
159588ddcfSespie @deftypefn Supplemental int strncasecmp (const char *@var{s1}, const char *@var{s2})
169588ddcfSespie 
179588ddcfSespie A case-insensitive @code{strncmp}.
189588ddcfSespie 
199588ddcfSespie @end deftypefn
209588ddcfSespie 
219588ddcfSespie */
229588ddcfSespie 
2300bf4279Sespie #if defined(LIBC_SCCS) && !defined(lint)
2400bf4279Sespie static char sccsid[] = "@(#)strcasecmp.c	5.5 (Berkeley) 11/24/87";
2500bf4279Sespie #endif /* LIBC_SCCS and not lint */
2600bf4279Sespie 
2700bf4279Sespie #include <ansidecl.h>
2800bf4279Sespie #include <stddef.h>
2900bf4279Sespie 
3000bf4279Sespie /*
3100bf4279Sespie  * This array is designed for mapping upper and lower case letter
3200bf4279Sespie  * together for a case independent comparison.  The mappings are
3300bf4279Sespie  * based upon ascii character sequences.
3400bf4279Sespie  */
359588ddcfSespie static const unsigned char charmap[] = {
3600bf4279Sespie 	'\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
3700bf4279Sespie 	'\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
3800bf4279Sespie 	'\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
3900bf4279Sespie 	'\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
4000bf4279Sespie 	'\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
4100bf4279Sespie 	'\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
4200bf4279Sespie 	'\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
4300bf4279Sespie 	'\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
4400bf4279Sespie 	'\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
4500bf4279Sespie 	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
4600bf4279Sespie 	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
4700bf4279Sespie 	'\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
4800bf4279Sespie 	'\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
4900bf4279Sespie 	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
5000bf4279Sespie 	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
5100bf4279Sespie 	'\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
5200bf4279Sespie 	'\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
5300bf4279Sespie 	'\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
5400bf4279Sespie 	'\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
5500bf4279Sespie 	'\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
5600bf4279Sespie 	'\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
5700bf4279Sespie 	'\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
5800bf4279Sespie 	'\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
5900bf4279Sespie 	'\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
6000bf4279Sespie 	'\300', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
6100bf4279Sespie 	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
6200bf4279Sespie 	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
6300bf4279Sespie 	'\370', '\371', '\372', '\333', '\334', '\335', '\336', '\337',
6400bf4279Sespie 	'\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
6500bf4279Sespie 	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
6600bf4279Sespie 	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
6700bf4279Sespie 	'\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
6800bf4279Sespie };
6900bf4279Sespie 
7000bf4279Sespie int
strncasecmp(const char * s1,const char * s2,register size_t n)71*150b7e42Smiod strncasecmp(const char *s1, const char *s2, register size_t n)
7200bf4279Sespie {
7300bf4279Sespie     register unsigned char u1, u2;
7400bf4279Sespie 
7500bf4279Sespie     for (; n != 0; --n) {
7600bf4279Sespie 	u1 = (unsigned char) *s1++;
7700bf4279Sespie 	u2 = (unsigned char) *s2++;
7800bf4279Sespie 	if (charmap[u1] != charmap[u2]) {
7900bf4279Sespie 	    return charmap[u1] - charmap[u2];
8000bf4279Sespie 	}
8100bf4279Sespie 	if (u1 == '\0') {
8200bf4279Sespie 	    return 0;
8300bf4279Sespie 	}
8400bf4279Sespie     }
8500bf4279Sespie     return 0;
8600bf4279Sespie }
87