diff options
Diffstat (limited to 'st.c')
-rw-r--r-- | st.c | 56 |
1 files changed, 55 insertions, 1 deletions
@@ -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) { |