aboutsummaryrefslogtreecommitdiff
path: root/compat
diff options
context:
space:
mode:
authorMosder <git@mosder.eu>2026-09-16 23:47:49 +0200
committerMosder <git@mosder.eu>2026-09-16 23:47:49 +0200
commit644130802a51d91b90e85a0769f642c3e0203aef (patch)
treead97ac1da8541a440a86c4c99402354bd94b06ca /compat
parent4af9b2a86ad5f5b7e59ba882aa527ecead75be0e (diff)
feat: added a simple compatibbility layer for functions not from C99 standard
Diffstat (limited to 'compat')
-rw-r--r--compat/compat.c31
-rw-r--r--compat/compat.h21
2 files changed, 52 insertions, 0 deletions
diff --git a/compat/compat.c b/compat/compat.c
new file mode 100644
index 0000000..1112146
--- /dev/null
+++ b/compat/compat.c
@@ -0,0 +1,31 @@
+#include "compat.h"
+
+#ifdef NO_STRDUP
+#include "moslib/safe.h"
+#include <string.h>
+char *strdup(const char *s) {
+ char *s2 = mos_safe_malloc(strlen(s) + 1);
+ strcpy(s2, s);
+ return s2;
+}
+#endif // NO_STRDUP
+
+#ifdef NO_MEMMEM
+void *memmem(const void *h, size_t h_size, const void *n, size_t n_size) {
+ if (n_size == 0)
+ return (void *)h;
+ if (n_size > h_size)
+ return NULL;
+
+ const unsigned char *p = h;
+ const unsigned char *end = p + h_size - n_size + 1;
+ unsigned char c = *(unsigned char *)n;
+ while ((p = memchr(p, c, end - p))) {
+ if (memcmp(p, n, n_size) == 0)
+ return (void *)p;
+ p++;
+ }
+
+ return NULL;
+}
+#endif // NO_MEMMEM
diff --git a/compat/compat.h b/compat/compat.h
new file mode 100644
index 0000000..b36b17f
--- /dev/null
+++ b/compat/compat.h
@@ -0,0 +1,21 @@
+// compat.h
+// Compatibility layer for functions not in standard C99
+
+#ifndef MOSLIB_COMPAT_H
+#define MOSLIB_COMPAT_H
+
+#define _XOPEN_SOURCE 500
+#define _GNU_SOURCE
+
+typedef void declaration;
+
+#ifdef NO_STRDUP
+extern char *strdup(const char *s);
+#endif // NO_STRDUP
+
+#ifdef NO_MEMMEM
+#include <stddef.h>
+extern void *memmem(const void *h, size_t h_size, const void *n, size_t n_size);
+#endif // NO_MEMMEM
+
+#endif // MOSLIB_COMPAT_H