diff options
author | Jari Vetoniemi <mailroxas@gmail.com> | 2014-04-12 12:55:05 +0300 |
---|---|---|
committer | Jari Vetoniemi <mailroxas@gmail.com> | 2014-04-12 12:55:05 +0300 |
commit | 471046d1b2f9ee0a7f6ac3814a261ef67e218976 (patch) | |
tree | 58b7e41539ed39741c2b541976ae732ff77522d9 /lib | |
parent | 058d8a98edb99caa538a922ac13f0f9fab5fb7fb (diff) | |
download | bemenu-471046d1b2f9ee0a7f6ac3814a261ef67e218976.tar.gz bemenu-471046d1b2f9ee0a7f6ac3814a261ef67e218976.tar.bz2 bemenu-471046d1b2f9ee0a7f6ac3814a261ef67e218976.zip |
Make comparator functions follow standard more.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/internal.h | 1 | ||||
-rw-r--r-- | lib/util.c | 41 |
2 files changed, 31 insertions, 11 deletions
diff --git a/lib/internal.h b/lib/internal.h index 985d366..c33c441 100644 --- a/lib/internal.h +++ b/lib/internal.h @@ -159,6 +159,7 @@ int _bmItemListRemoveItem(struct _bmItemList *list, const bmItem *item); /* util.c */ char* _bmStrdup(const char *s); int _bmStrupcmp(const char *hay, const char *needle); +int _bmStrnupcmp(const char *hay, const char *needle, size_t len); char* _bmStrupstr(const char *hay, const char *needle); bmItem** _bmShrinkItemList(bmItem ***inOutList, size_t osize, size_t nsize); int _bmUtf8StringScreenWidth(const char *string); @@ -32,19 +32,38 @@ char* _bmStrdup(const char *string) * * @param hay C "string" to match against. * @param needle C "string" to match. + * @return Less than, equal to or greater than zero if hay is lexicographically less than, equal to or greater than needle. */ int _bmStrupcmp(const char *hay, const char *needle) { - size_t i, len; + size_t len, len2; - if ((len = strlen(hay)) != strlen(needle)) - return 1; + if ((len = strlen(hay)) != (len2 = strlen(needle))) + return hay[len] - needle[len2]; - for (i = 0; i != len; ++i) - if (toupper(hay[i]) != toupper(needle[i])) - return 1; + return _bmStrnupcmp(hay, needle, len); +} + +/** + * Portable case-insensitive strncmp. + * + * @param hay C "string" to match against. + * @param needle C "string" to match. + * @return Less than, equal to or greater than zero if hay is lexicographically less than, equal to or greater than needle. + */ +int _bmStrnupcmp(const char *hay, const char *needle, size_t len) +{ + size_t i = 0; + unsigned char a = 0, b = 0; + + const unsigned char *p1 = (const unsigned char*)hay; + const unsigned char *p2 = (const unsigned char*)needle; - return 0; + for (i = 0; len > 0; --len, ++i) + if ((a = toupper(*p1++)) != (b = toupper(*p2++))) + return a - b; + + return a - b; } /** @@ -57,13 +76,13 @@ char* _bmStrupstr(const char *hay, const char *needle) { size_t i, r = 0, p = 0, len, len2; - if (!_bmStrupcmp(hay, needle)) - return (char*)hay; - if ((len = strlen(hay)) < (len2 = strlen(needle))) return NULL; - for (i = 0; i != len; ++i) { + if (!_bmStrnupcmp(hay, needle, len2)) + return (char*)hay; + + for (i = 0; i < len; ++i) { if (p == len2) return (char*)hay + r; |