From a8352a8988ea68d71dfe7669f1bdcca36e793803 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Wed, 2 Sep 2009 22:25:50 +0200 Subject: [PATCH] Merge patches for OpenBSD compatibility --- common.mk | 7 +++++++ include/util.h | 5 +++++ src/config.c | 9 +++++++++ src/util.c | 40 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+) diff --git a/common.mk b/common.mk index 485038b4..2e167c9e 100644 --- a/common.mk +++ b/common.mk @@ -46,6 +46,13 @@ CFLAGS += -idirafter /usr/pkg/include LDFLAGS += -Wl,-rpath,/usr/local/lib -Wl,-rpath,/usr/pkg/lib endif +ifeq ($(UNAME),OpenBSD) +CFLAGS += -ftrampolines +CFLAGS += -I${X11BASE}/include +LDFLAGS += -liconv +LDFLAGS += -L${X11BASE}/lib +endif + ifeq ($(UNAME),FreeBSD) LDFLAGS += -liconv endif diff --git a/include/util.h b/include/util.h index 0b335749..ed85d539 100644 --- a/include/util.h +++ b/include/util.h @@ -161,4 +161,9 @@ void switch_layout_mode(xcb_connection_t *conn, Container *container, int mode); Client *get_matching_client(xcb_connection_t *conn, const char *window_classtitle, Client *specific); +#if defined(__OpenBSD__) +/* OpenBSD does not provide memmem(), so we provide FreeBSD’s implementation */ +void *memmem(const void *l, size_t l_len, const void *s, size_t s_len); +#endif + #endif diff --git a/src/config.c b/src/config.c index 2e9ff5f6..d98f4a92 100644 --- a/src/config.c +++ b/src/config.c @@ -312,7 +312,16 @@ void load_configuration(xcb_connection_t *conn, const char *override_configpath, rest++; if (*rest != ' ') die("Invalid binding (keysym)\n"); +#if defined(__OpenBSD__) + size_t len = strlen(sym); + if (len > (rest - sym)) + len = (rest - sym); + new->symbol = smalloc(len + 1); + memcpy(new->symbol, sym, len+1); + new->symbol[len]='\0'; +#else new->symbol = strndup(sym, (rest - sym)); +#endif } rest++; LOG("keycode = %d, symbol = %s, modifiers = %d, command = *%s*\n", new->keycode, new->symbol, modifiers, rest); diff --git a/src/util.c b/src/util.c index e9f5472e..64ab82a9 100644 --- a/src/util.c +++ b/src/util.c @@ -18,6 +18,9 @@ #include #include #include +#if defined(__OpenBSD__) +#include +#endif #include @@ -472,3 +475,40 @@ done: FREE(to_title_ucs); return matching; } + +#if defined(__OpenBSD__) + +/* + * 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) { + 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; + + /* "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); + + /* 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; + + return NULL; +} + +#endif +