/* not reached */
}
-#if 0
-
-#if defined(__OpenBSD__)
+#if defined(__OpenBSD__) || defined(__APPLE__)
/*
* Taken from FreeBSD
*
*/
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