1169695Skan/*
2169695Skan * Copyright (c) 1987 Regents of the University of California.
3169695Skan * All rights reserved.
4169695Skan *
5169695Skan * Redistribution and use in source and binary forms are permitted
6169695Skan * provided that this notice is preserved and that due credit is given
7169695Skan * to the University of California at Berkeley. The name of the University
8169695Skan * may not be used to endorse or promote products derived from this
9169695Skan * software without specific written prior permission. This software
10169695Skan * is provided ``as is'' without express or implied warranty.
11169695Skan */
12169695Skan
13169695Skan/*
14169695Skan
15169695Skan@deftypefn Supplemental int strncasecmp (const char *@var{s1}, const char *@var{s2})
16169695Skan
17169695SkanA case-insensitive @code{strncmp}.
18169695Skan
19169695Skan@end deftypefn
20169695Skan
21169695Skan*/
22169695Skan
23169695Skan#if defined(LIBC_SCCS) && !defined(lint)
24169695Skanstatic char sccsid[] = "@(#)strcasecmp.c	5.5 (Berkeley) 11/24/87";
25169695Skan#endif /* LIBC_SCCS and not lint */
26169695Skan
27169695Skan#include <ansidecl.h>
28169695Skan#include <stddef.h>
29169695Skan
30169695Skan/*
31169695Skan * This array is designed for mapping upper and lower case letter
32169695Skan * together for a case independent comparison.  The mappings are
33169695Skan * based upon ascii character sequences.
34169695Skan */
35169695Skanstatic const unsigned char charmap[] = {
36169695Skan	'\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
37169695Skan	'\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
38169695Skan	'\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
39169695Skan	'\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
40169695Skan	'\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
41169695Skan	'\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
42169695Skan	'\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
43169695Skan	'\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
44169695Skan	'\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
45169695Skan	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
46169695Skan	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
47169695Skan	'\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
48169695Skan	'\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
49169695Skan	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
50169695Skan	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
51169695Skan	'\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
52169695Skan	'\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
53169695Skan	'\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
54169695Skan	'\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
55169695Skan	'\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
56169695Skan	'\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
57169695Skan	'\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
58169695Skan	'\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
59169695Skan	'\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
60169695Skan	'\300', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
61169695Skan	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
62169695Skan	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
63169695Skan	'\370', '\371', '\372', '\333', '\334', '\335', '\336', '\337',
64169695Skan	'\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
65169695Skan	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
66169695Skan	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
67169695Skan	'\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
68169695Skan};
69169695Skan
70169695Skanint
71169695Skanstrncasecmp(const char *s1, const char *s2, register size_t n)
72169695Skan{
73169695Skan    register unsigned char u1, u2;
74169695Skan
75169695Skan    for (; n != 0; --n) {
76169695Skan	u1 = (unsigned char) *s1++;
77169695Skan	u2 = (unsigned char) *s2++;
78169695Skan	if (charmap[u1] != charmap[u2]) {
79169695Skan	    return charmap[u1] - charmap[u2];
80169695Skan	}
81169695Skan	if (u1 == '\0') {
82169695Skan	    return 0;
83169695Skan	}
84169695Skan    }
85169695Skan    return 0;
86169695Skan}
87