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