summaryrefslogtreecommitdiff
path: root/prism/strncasecmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'prism/strncasecmp.c')
-rw-r--r--prism/strncasecmp.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/prism/strncasecmp.c b/prism/strncasecmp.c
new file mode 100644
index 0000000000..a373cad6d7
--- /dev/null
+++ b/prism/strncasecmp.c
@@ -0,0 +1,37 @@
+#include "prism/internal/strncasecmp.h"
+
+#include "prism/compiler/inline.h"
+
+/**
+ * A locale-insensitive version of `tolower(3)`
+ */
+static PRISM_INLINE int
+pm_tolower(int c) {
+ if ('A' <= c && c <= 'Z') {
+ return c | 0x20;
+ }
+ return c;
+}
+
+/**
+ * Compare two strings, ignoring case, up to the given length. Returns 0 if the
+ * strings are equal, a negative number if string1 is less than string2, or a
+ * positive number if string1 is greater than string2.
+ *
+ * Note that this is effectively our own implementation of strncasecmp, but it's
+ * not available on all of the platforms we want to support so we're rolling it
+ * here.
+ */
+int
+pm_strncasecmp(const uint8_t *string1, const uint8_t *string2, size_t length) {
+ size_t offset = 0;
+ int difference = 0;
+
+ while (offset < length && string1[offset] != '\0') {
+ if (string2[offset] == '\0') return string1[offset];
+ if ((difference = pm_tolower(string1[offset]) - pm_tolower(string2[offset])) != 0) return difference;
+ offset++;
+ }
+
+ return difference;
+}