xref: /csrg-svn/lib/libc/string/strcasecmp.c (revision 61193)
131745Sbostic /*
2*61193Sbostic  * Copyright (c) 1987, 1993
3*61193Sbostic  *	The Regents of the University of California.  All rights reserved.
432676Sbostic  *
542635Sbostic  * %sccs.include.redist.c%
631745Sbostic  */
731745Sbostic 
846144Sbostic #include <sys/cdefs.h>
942149Sbostic #include <string.h>
1042149Sbostic 
1131745Sbostic #if defined(LIBC_SCCS) && !defined(lint)
12*61193Sbostic static char sccsid[] = "@(#)strcasecmp.c	8.1 (Berkeley) 06/04/93";
1332663Sbostic #endif /* LIBC_SCCS and not lint */
1431745Sbostic 
1542149Sbostic typedef unsigned char u_char;
1632663Sbostic 
1731745Sbostic /*
1831747Sbostic  * This array is designed for mapping upper and lower case letter
1931747Sbostic  * together for a case independent comparison.  The mappings are
2031747Sbostic  * based upon ascii character sequences.
2131745Sbostic  */
2242149Sbostic static const u_char charmap[] = {
2331747Sbostic 	'\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
2431747Sbostic 	'\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
2531747Sbostic 	'\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
2631747Sbostic 	'\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
2731747Sbostic 	'\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
2831747Sbostic 	'\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
2931747Sbostic 	'\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
3031747Sbostic 	'\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
3131747Sbostic 	'\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
3231747Sbostic 	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
3331747Sbostic 	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
3431747Sbostic 	'\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
3531747Sbostic 	'\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
3631747Sbostic 	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
3731747Sbostic 	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
3831747Sbostic 	'\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
3931747Sbostic 	'\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
4031747Sbostic 	'\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
4131747Sbostic 	'\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
4231747Sbostic 	'\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
4331747Sbostic 	'\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
4431747Sbostic 	'\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
4531747Sbostic 	'\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
4631747Sbostic 	'\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
4736699Sbostic 	'\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
4836699Sbostic 	'\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317',
4936699Sbostic 	'\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327',
5036699Sbostic 	'\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
5131747Sbostic 	'\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
5231747Sbostic 	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
5331747Sbostic 	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
5431747Sbostic 	'\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
5531747Sbostic };
5631747Sbostic 
5742149Sbostic int
strcasecmp(s1,s2)5831745Sbostic strcasecmp(s1, s2)
5942149Sbostic 	const char *s1, *s2;
6031745Sbostic {
6142149Sbostic 	register const u_char *cm = charmap,
6242149Sbostic 			*us1 = (const u_char *)s1,
6342149Sbostic 			*us2 = (const u_char *)s2;
6431745Sbostic 
6532663Sbostic 	while (cm[*us1] == cm[*us2++])
6632663Sbostic 		if (*us1++ == '\0')
6742149Sbostic 			return (0);
6842149Sbostic 	return (cm[*us1] - cm[*--us2]);
6931745Sbostic }
7031745Sbostic 
7142149Sbostic int
strncasecmp(s1,s2,n)7231993Sbostic strncasecmp(s1, s2, n)
7342149Sbostic 	const char *s1, *s2;
7442149Sbostic 	register size_t n;
7531745Sbostic {
7642149Sbostic 	if (n != 0) {
7742149Sbostic 		register const u_char *cm = charmap,
7842149Sbostic 				*us1 = (const u_char *)s1,
7942149Sbostic 				*us2 = (const u_char *)s2;
8031745Sbostic 
8142149Sbostic 		do {
8242149Sbostic 			if (cm[*us1] != cm[*us2++])
8342149Sbostic 				return (cm[*us1] - cm[*--us2]);
8442149Sbostic 			if (*us1++ == '\0')
8542149Sbostic 				break;
8642149Sbostic 		} while (--n != 0);
8742149Sbostic 	}
8842149Sbostic 	return (0);
8931745Sbostic }
90