xref: /csrg-svn/lib/libc/string/strcasecmp.c (revision 42149)
131745Sbostic /*
231745Sbostic  * Copyright (c) 1987 Regents of the University of California.
332676Sbostic  * All rights reserved.
432676Sbostic  *
532676Sbostic  * Redistribution and use in source and binary forms are permitted
634821Sbostic  * provided that the above copyright notice and this paragraph are
734821Sbostic  * duplicated in all such forms and that any documentation,
834821Sbostic  * advertising materials, and other materials related to such
934821Sbostic  * distribution and use acknowledge that the software was developed
1034821Sbostic  * by the University of California, Berkeley.  The name of the
1134821Sbostic  * University may not be used to endorse or promote products derived
1234821Sbostic  * from this software without specific prior written permission.
1334821Sbostic  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
1434821Sbostic  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
1534821Sbostic  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
1631745Sbostic  */
1731745Sbostic 
18*42149Sbostic #include <sys/stdc.h>
19*42149Sbostic #include <string.h>
20*42149Sbostic 
2131745Sbostic #if defined(LIBC_SCCS) && !defined(lint)
22*42149Sbostic static const char sccsid[] = "@(#)strcasecmp.c	5.8 (Berkeley) 05/16/90";
2332663Sbostic #endif /* LIBC_SCCS and not lint */
2431745Sbostic 
25*42149Sbostic typedef unsigned char u_char;
2632663Sbostic 
2731745Sbostic /*
2831747Sbostic  * This array is designed for mapping upper and lower case letter
2931747Sbostic  * together for a case independent comparison.  The mappings are
3031747Sbostic  * based upon ascii character sequences.
3131745Sbostic  */
32*42149Sbostic static const u_char charmap[] = {
3331747Sbostic 	'\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
3431747Sbostic 	'\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
3531747Sbostic 	'\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
3631747Sbostic 	'\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
3731747Sbostic 	'\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
3831747Sbostic 	'\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
3931747Sbostic 	'\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
4031747Sbostic 	'\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
4131747Sbostic 	'\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
4231747Sbostic 	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
4331747Sbostic 	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
4431747Sbostic 	'\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
4531747Sbostic 	'\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
4631747Sbostic 	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
4731747Sbostic 	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
4831747Sbostic 	'\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
4931747Sbostic 	'\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
5031747Sbostic 	'\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
5131747Sbostic 	'\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
5231747Sbostic 	'\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
5331747Sbostic 	'\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
5431747Sbostic 	'\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
5531747Sbostic 	'\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
5631747Sbostic 	'\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
5736699Sbostic 	'\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
5836699Sbostic 	'\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317',
5936699Sbostic 	'\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327',
6036699Sbostic 	'\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
6131747Sbostic 	'\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
6231747Sbostic 	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
6331747Sbostic 	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
6431747Sbostic 	'\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
6531747Sbostic };
6631747Sbostic 
67*42149Sbostic int
6831745Sbostic strcasecmp(s1, s2)
69*42149Sbostic 	const char *s1, *s2;
7031745Sbostic {
71*42149Sbostic 	register const u_char *cm = charmap,
72*42149Sbostic 			*us1 = (const u_char *)s1,
73*42149Sbostic 			*us2 = (const u_char *)s2;
7431745Sbostic 
7532663Sbostic 	while (cm[*us1] == cm[*us2++])
7632663Sbostic 		if (*us1++ == '\0')
77*42149Sbostic 			return (0);
78*42149Sbostic 	return (cm[*us1] - cm[*--us2]);
7931745Sbostic }
8031745Sbostic 
81*42149Sbostic int
8231993Sbostic strncasecmp(s1, s2, n)
83*42149Sbostic 	const char *s1, *s2;
84*42149Sbostic 	register size_t n;
8531745Sbostic {
86*42149Sbostic 	if (n != 0) {
87*42149Sbostic 		register const u_char *cm = charmap,
88*42149Sbostic 				*us1 = (const u_char *)s1,
89*42149Sbostic 				*us2 = (const u_char *)s2;
9031745Sbostic 
91*42149Sbostic 		do {
92*42149Sbostic 			if (cm[*us1] != cm[*us2++])
93*42149Sbostic 				return (cm[*us1] - cm[*--us2]);
94*42149Sbostic 			if (*us1++ == '\0')
95*42149Sbostic 				break;
96*42149Sbostic 		} while (--n != 0);
97*42149Sbostic 	}
98*42149Sbostic 	return (0);
9931745Sbostic }
100