mutt stable branch with some hacks
1/*
2 * Copyright (C) 2001 Thomas Roessler <roessler@does-not-exist.org>
3 *
4 * This program is free software; you can redistribute it
5 * and/or modify it under the terms of the GNU General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later
8 * version.
9 *
10 * This program is distributed in the hope that it will be
11 * useful, but WITHOUT ANY WARRANTY; without even the implied
12 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
13 * PURPOSE. See the GNU General Public License for more
14 * details.
15 *
16 * You should have received a copy of the GNU General Public
17 * License along with this program; if not, write to the Free
18 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
20 *
21 */
22
23
24/*
25 * Versions of the string comparison functions which are
26 * locale-insensitive.
27 */
28
29#if HAVE_CONFIG_H
30# include "config.h"
31#endif
32
33#include <stdio.h>
34#include <stdlib.h>
35#include "ascii.h"
36
37inline int ascii_isupper (int c)
38{
39 return (c >= 'A') && (c <= 'Z');
40}
41
42inline int ascii_islower (int c)
43{
44 return (c >= 'a') && (c <= 'z');
45}
46
47inline int ascii_toupper (int c)
48{
49 if (ascii_islower (c))
50 return c & ~32;
51
52 return c;
53}
54
55inline int ascii_tolower (int c)
56{
57 if (ascii_isupper (c))
58 return c | 32;
59
60 return c;
61}
62
63int ascii_strcasecmp (const char *a, const char *b)
64{
65 int i;
66
67 if (a == b)
68 return 0;
69 if (a == NULL && b)
70 return -1;
71 if (b == NULL && a)
72 return 1;
73
74 for (;; a++, b++)
75 {
76 if ((i = ascii_tolower (*a) - ascii_tolower (*b)))
77 return i;
78 /* test for NUL here rather that in the for loop in order to detect unqual
79 * length strings (see http://dev.mutt.org/trac/ticket/3601)
80 */
81 if (!*a)
82 break;
83 }
84
85 return 0;
86}
87
88int ascii_strncasecmp (const char *a, const char *b, int n)
89{
90 int i, j;
91
92 if (a == b)
93 return 0;
94 if (a == NULL && b)
95 return -1;
96 if (b == NULL && a)
97 return 1;
98
99 for (j = 0; (*a || *b) && j < n; a++, b++, j++)
100 {
101 if ((i = ascii_tolower (*a) - ascii_tolower (*b)))
102 return i;
103 }
104
105 return 0;
106}