summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJari Vetoniemi <mailroxas@gmail.com>2014-04-12 12:55:05 +0300
committerJari Vetoniemi <mailroxas@gmail.com>2014-04-12 12:55:05 +0300
commit471046d1b2f9ee0a7f6ac3814a261ef67e218976 (patch)
tree58b7e41539ed39741c2b541976ae732ff77522d9 /lib
parent058d8a98edb99caa538a922ac13f0f9fab5fb7fb (diff)
downloadbemenu-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.h1
-rw-r--r--lib/util.c41
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);
diff --git a/lib/util.c b/lib/util.c
index 06c89cf..a77e2ff 100644
--- a/lib/util.c
+++ b/lib/util.c
@@ -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;