summaryrefslogtreecommitdiff
path: root/st.c
diff options
context:
space:
mode:
Diffstat (limited to 'st.c')
-rw-r--r--st.c56
1 files changed, 55 insertions, 1 deletions
diff --git a/st.c b/st.c
index a0e669294b..4af67caf56 100644
--- a/st.c
+++ b/st.c
@@ -54,7 +54,7 @@ static const struct st_hash_type type_strhash = {
static int strcasehash(const char *);
static const struct st_hash_type type_strcasehash = {
- strcasecmp,
+ st_strcasecmp,
strcasehash,
};
@@ -861,6 +861,60 @@ strhash(register const char *string)
return hval;
}
+int
+st_strcasecmp(const char *s1, const char *s2)
+{
+ unsigned int c1, c2;
+
+ while (1) {
+ c1 = (unsigned char)*s1++;
+ c2 = (unsigned char)*s2++;
+ if (!c1) break;
+ if (!c2) break;
+ if ((unsigned int)(c1 - 'A') <= ('Z' - 'A')) c1 += 'a' - 'A';
+ if ((unsigned int)(c2 - 'A') <= ('Z' - 'A')) c2 += 'a' - 'A';
+ if (c1 != c2) {
+ if (c1 > c2)
+ return 1;
+ else
+ return -1;
+ }
+ }
+ if (c1 != '\0')
+ return 1;
+ if (c2 != '\0')
+ return -1;
+ return 0;
+}
+
+int
+st_strncasecmp(const char *s1, const char *s2, size_t n)
+{
+ unsigned int c1, c2;
+
+ while (n--) {
+ c1 = (unsigned char)*s1++;
+ c2 = (unsigned char)*s2++;
+ if (!c1) break;
+ if (!c2) break;
+ if ((unsigned int)(c1 - 'A') <= ('Z' - 'A')) c1 += 'a' - 'A';
+ if ((unsigned int)(c2 - 'A') <= ('Z' - 'A')) c2 += 'a' - 'A';
+ if (c1 != c2) {
+ if (c1 > c2)
+ return 1;
+ else
+ return -1;
+ }
+ }
+ if (n == 0)
+ return 0;
+ if (c1 != '\0')
+ return 1;
+ if (c2 != '\0')
+ return -1;
+ return 0;
+}
+
static int
strcasehash(register const char *string)
{