summaryrefslogtreecommitdiffstats
path: root/ascii.c
diff options
context:
space:
mode:
authorThomas Roessler <roessler@does-not-exist.org>2001-04-26 13:36:33 +0000
committerThomas Roessler <roessler@does-not-exist.org>2001-04-26 13:36:33 +0000
commitc73ebd9aa108d55a09c7eebbf9a81e3453fa0c3b (patch)
treea35487e7f469b6510dab2172a21c8c7d36265033 /ascii.c
parent3f16589816ab217ec425ecbf026a9a5ade18333f (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.c97
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;
+}