/*
* Copyright (C) 2015 Michael Jeanson <mjeanson@efficios.com>
+ * 2015 Jérémie Galarneau <jeremie.galarneau@efficios.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
}
#endif /* HAVE_STRNDUP */
+#ifdef HAVE_FLS
+static inline int lttng_fls(int val)
+{
+ return fls(val);
+}
+#else
+static inline int lttng_fls(int val)
+{
+ int r = 32;
+ unsigned int x = (unsigned int) val;
+
+ if (!x)
+ return 0;
+ if (!(x & 0xFFFF0000U)) {
+ x <<= 16;
+ r -= 16;
+ }
+ if (!(x & 0xFF000000U)) {
+ x <<= 8;
+ r -= 8;
+ }
+ if (!(x & 0xF0000000U)) {
+ x <<= 4;
+ r -= 4;
+ }
+ if (!(x & 0xC0000000U)) {
+ x <<= 2;
+ r -= 2;
+ }
+ if (!(x & 0x80000000U)) {
+ r -= 1;
+ }
+ return r;
+}
+#endif /* HAVE_FLS */
+
+#if HAVE_MEMRCHR
+static inline
+void *lttng_memrchr(const void *s, int c, size_t n)
+{
+ return memrchr(s, c, n);
+}
+#else
+static inline
+void *lttng_memrchr(const void *s, int c, size_t n)
+{
+ int i;
+ const char *str = s;
+ for (i = n-1; i >= 0; i--) {
+ if (str[i] == (char)c) {
+ return (void *)(str+i);
+ }
+ }
+ return NULL;
+}
+#endif /* HAVE_MEMRCHR */
+
#endif /* _COMPAT_STRING_H */