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