1// SPDX-License-Identifier: MIT 2/* 3 * Copyright © 2013 Red Hat, Inc. 4 */ 5 6#ifndef _UTIL_H_ 7#define _UTIL_H_ 8 9#include "config.h" 10#include <stdbool.h> 11#include <string.h> 12 13#define LONG_BITS (sizeof(long) * 8) 14#define NLONGS(x) (((x) + LONG_BITS - 1) / LONG_BITS) 15#define ARRAY_LENGTH(a) (sizeof(a) / (sizeof((a)[0]))) 16#define unlikely(x) (__builtin_expect(!!(x),0)) 17 18#undef min 19#undef max 20#ifdef __GNUC__ 21#define min(a,b) \ 22 ({ __typeof__ (a) _a = (a); \ 23 __typeof__ (b) _b = (b); \ 24 _a > _b ? _b : _a; \ 25 }) 26#define max(a,b) \ 27 ({ __typeof__ (a) _a = (a); \ 28 __typeof__ (b) _b = (b); \ 29 _a > _b ? _a : _b; \ 30 }) 31#else 32#define min(a,b) ((a) > (b) ? (b) : (a)) 33#define max(a,b) ((a) > (b) ? (a) : (b)) 34#endif 35 36static inline bool 37startswith(const char *str, size_t len, const char *prefix, size_t plen) 38{ 39 return len >= plen && !strncmp(str, prefix, plen); 40} 41 42static inline int 43bit_is_set(const unsigned long *array, int bit) 44{ 45 return !!(array[bit / LONG_BITS] & (1LL << (bit % LONG_BITS))); 46} 47 48static inline void 49set_bit(unsigned long *array, int bit) 50{ 51 array[bit / LONG_BITS] |= (1LL << (bit % LONG_BITS)); 52} 53 54static inline void 55clear_bit(unsigned long *array, int bit) 56{ 57 array[bit / LONG_BITS] &= ~(1LL << (bit % LONG_BITS)); 58} 59 60static inline void 61set_bit_state(unsigned long *array, int bit, int state) 62{ 63 if (state) 64 set_bit(array, bit); 65 else 66 clear_bit(array, bit); 67} 68 69#endif 70