diff options
author | Thomas Roessler <roessler@does-not-exist.org> | 2001-04-26 13:36:33 +0000 |
---|---|---|
committer | Thomas Roessler <roessler@does-not-exist.org> | 2001-04-26 13:36:33 +0000 |
commit | c73ebd9aa108d55a09c7eebbf9a81e3453fa0c3b (patch) | |
tree | a35487e7f469b6510dab2172a21c8c7d36265033 /ascii.c | |
parent | 3f16589816ab217ec425ecbf026a9a5ade18333f (diff) |
Add ascii_strcasecmp() and ascii_strncasecmp() functions which do
locale-independent and case-insensitive string comparisons. Needed
for mutt to work in iso-8859-9 environments, where tolower('I') !=
'i'.
Diffstat (limited to 'ascii.c')
-rw-r--r-- | ascii.c | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/ascii.c b/ascii.c new file mode 100644 index 00000000..d4553f68 --- /dev/null +++ b/ascii.c @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2001 Thomas Roessler <roessler@does-not-exist.org> + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the Free + * Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111, USA. + * + */ + + +/* + * Versions of the string comparison functions which are + * locale-insensitive. + */ + +#include <stdio.h> +#include <stdlib.h> +#include "ascii.h" + +int ascii_isupper (int c) +{ + return (c >= 'A') && (c <= 'Z'); +} + +int ascii_islower (int c) +{ + return (c >= 'a') && (c <= 'z'); +} + +int ascii_toupper (int c) +{ + if (ascii_islower (c)) + return c & ~32; + + return c; +} + +int ascii_tolower (int c) +{ + if (ascii_isupper (c)) + return c | 32; + + return c; +} + +int ascii_strcasecmp (const char *a, const char *b) +{ + int i; + + if (a == b) + return 0; + if (a == NULL && b) + return -1; + if (b == NULL && a) + return 1; + + for (; *a || *b; a++, b++) + { + if ((i = ascii_tolower (*a) - ascii_tolower (*b))) + return i; + } + + return 0; +} + +int ascii_strncasecmp (const char *a, const char *b, int n) +{ + int i, j; + + if (a == b) + return 0; + if (a == NULL && b) + return -1; + if (b == NULL && a) + return 1; + + for (j = 0; (*a || *b) && j < n; a++, b++, j++) + { + if ((i = ascii_tolower (*a) - ascii_tolower (*b))) + return i; + } + + return 0; +} |