X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fcompat%2Fstring.h;h=a7bcab0a8c345a6e34019b2419d424207372be10;hp=91a1c09e2f1df86bff864da0235ba5a9989b5a1b;hb=6ec9dc48cf7f3d5e1fc01f741197c0bacc94bbf0;hpb=f5436bfcf6797b979b308a9af782750f9d079686 diff --git a/src/common/compat/string.h b/src/common/compat/string.h index 91a1c09e2..a7bcab0a8 100644 --- a/src/common/compat/string.h +++ b/src/common/compat/string.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2015 Michael Jeanson + * 2015 Jérémie Galarneau * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -86,4 +87,61 @@ end: } #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 */