]> git.sur5r.net Git - i3/i3/commitdiff
use memmem and strndup from FreeBSD on Darwin (Thanks Marcus)
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 17 Jul 2011 13:18:45 +0000 (15:18 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 17 Jul 2011 13:18:45 +0000 (15:18 +0200)
include/util.h
src/util.c

index 276ea5b9e20db05eca0fcc0b5f0ba59606444188..f3ab28ba5a1b0c196d01b5984a9ca5f2bbff8f14 100644 (file)
@@ -164,4 +164,18 @@ char *get_process_filename(const char *prefix);
  */
 void i3_restart(bool forget_layout);
 
+#if defined(__OpenBSD__) || defined(__APPLE__)
+
+/*
+ * Taken from FreeBSD
+ * Find the first occurrence of the byte string s in byte string l.
+ *
+ */
+void *memmem(const void *l, size_t l_len, const void *s, size_t s_len);
+
+#endif
+
+#if defined(__APPLE__)
+#endif
+
 #endif
index cc93df216f307f2640081aac5b0536cac85a42ca..1ad43d3f5a431c77ff4e022af479f9b710460d9d 100644 (file)
@@ -448,9 +448,7 @@ void i3_restart(bool forget_layout) {
     /* not reached */
 }
 
-#if 0
-
-#if defined(__OpenBSD__)
+#if defined(__OpenBSD__) || defined(__APPLE__)
 
 /*
  * Taken from FreeBSD
@@ -458,31 +456,54 @@ void i3_restart(bool forget_layout) {
  *
  */
 void *memmem(const void *l, size_t l_len, const void *s, size_t s_len) {
-        register char *cur, *last;
-        const char *cl = (const char *)l;
-        const char *cs = (const char *)s;
+    register char *cur, *last;
+    const char *cl = (const char *)l;
+    const char *cs = (const char *)s;
 
-        /* we need something to compare */
-        if (l_len == 0 || s_len == 0)
-                return NULL;
+    /* we need something to compare */
+    if (l_len == 0 || s_len == 0)
+        return NULL;
 
-        /* "s" must be smaller or equal to "l" */
-        if (l_len < s_len)
-                return NULL;
+    /* "s" must be smaller or equal to "l" */
+    if (l_len < s_len)
+        return NULL;
 
-        /* special case where s_len == 1 */
-        if (s_len == 1)
-                return memchr(l, (int)*cs, l_len);
+    /* special case where s_len == 1 */
+    if (s_len == 1)
+        return memchr(l, (int)*cs, l_len);
 
-        /* the last position where its possible to find "s" in "l" */
-        last = (char *)cl + l_len - s_len;
+    /* the last position where its possible to find "s" in "l" */
+    last = (char *)cl + l_len - s_len;
 
-        for (cur = (char *)cl; cur <= last; cur++)
-                if (cur[0] == cs[0] && memcmp(cur, cs, s_len) == 0)
-                        return cur;
+    for (cur = (char *)cl; cur <= last; cur++)
+        if (cur[0] == cs[0] && memcmp(cur, cs, s_len) == 0)
+            return cur;
 
-        return NULL;
+    return NULL;
 }
 
 #endif
+
+#if defined(__APPLE__)
+
+/*
+ * Taken from FreeBSD
+ * Returns a pointer to a new string which is a duplicate of the
+ * string, but only copies at most n characters.
+ *
+ */
+char *strndup(const char *str, size_t n) {
+    size_t len;
+    char *copy;
+
+    for (len = 0; len < n && str[len]; len++)
+        continue;
+
+    if ((copy = malloc(len + 1)) == NULL)
+        return (NULL);
+    memcpy(copy, str, len);
+    copy[len] = '\0';
+    return (copy);
+}
+
 #endif